日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
【方向盤】版本歷史&代碼示例之:JavaMail、JDBC

前言

若你還不太清楚Java EE是什么,可先移步這里:什么是Java EE?

在瑯琊等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)營(yíng)銷推廣,外貿(mào)網(wǎng)站建設(shè),瑯琊網(wǎng)站建設(shè)費(fèi)用合理。

發(fā)郵件是企業(yè)級(jí)應(yīng)用開發(fā)的剛性需求,如:每晚定時(shí)任務(wù)跑完后自動(dòng)將結(jié)果數(shù)據(jù)發(fā)封郵件到領(lǐng)導(dǎo)郵箱供以查閱。郵件雖然“古老”,但相較于IM消息具有很多不可替代的優(yōu)勢(shì):

  • 更為正式:相對(duì)重要的場(chǎng)合/數(shù)據(jù)用郵件更為合適
  • 承載內(nèi)容多:一封郵件的文本字?jǐn)?shù)理論上無上限
  • 格式豐富:可由附件、圖片、文本組合。支持HTML排版
  • 發(fā)送形式豐富:除了收件人外,還可以抄送、密送

既然發(fā)郵件的場(chǎng)景這么常見,但據(jù)我經(jīng)驗(yàn),每每遇到發(fā)郵件問題時(shí),同事往往“頭疼不已”,你是否也有類似情況呢?本文就來聊聊JavaMail的發(fā)展歷程,然后給出一些代碼示例。

除此之外,本文還會(huì)聊聊更為重要的JDBC,它高頻的出現(xiàn)在各大面試場(chǎng)合里,是考驗(yàn)一個(gè)求職者技術(shù)基礎(chǔ)水平的重要知識(shí)點(diǎn),更是流行框架MyBatis的基石。

所屬專欄

【方向盤】-Java EE

相關(guān)下載

  • 【本專欄源代碼】:https://github.com/yourbatman/FXP-java-ee
  • 【女媧Knife-Initializr工程】訪問地址:http://152.136.106.14:8761
  • 【程序員專用網(wǎng)盤】公益上線啦,注冊(cè)送1G超小容量,幫你實(shí)踐做減法:https://wangpan.yourbatman.cn
  • 【Java開發(fā)軟件包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0 提取碼:javakit

版本約定

  • Java EE:6、7、8
  • Jakarta EE:8、9、9.1

正文

JavaMail

JavaMail API提供了一個(gè)獨(dú)立于平臺(tái)和協(xié)議的框架來構(gòu)建郵件和消息傳遞應(yīng)用程序。JavaMail API作為可選包提供,可與Java SE平臺(tái)一起使用,也包含在JavaEE平臺(tái)中。

JavaMail 是sun公司為方便Java開發(fā)人員在應(yīng)用程序中實(shí)現(xiàn)郵件發(fā)送和接收功能而提供的一套標(biāo)準(zhǔn)開發(fā)包,它支持一些常用的郵件協(xié)議,如SMTP,POP3,IMAP,還有MIME(發(fā)送附件)等。我們?cè)谑褂肑avaMail API 編寫郵件時(shí),無須考慮郵件的底層實(shí)現(xiàn)細(xì)節(jié),只要調(diào)用JavaMail 開發(fā)包中相應(yīng)的API類就可以了。

 
 
 
 
  1.  
  2.  
  3.     javax.mail 
  4.     javax.mail-api 
  5.     1.6.2 
  6.  
  7.  
  8.  
  9.  
  10.     jakarta.mail 
  11.     jakarta.mail-api 
  12.     2.0.1  
  13.      
  14.  

版本歷程

JavaMail的最新版本是1.6.2,于2018.08發(fā)布。

javax.mail-api.jar是JavaMail的API,一般無需單獨(dú)引入。即使需要引入,scope使用provide即可。com.sun.mail:javax.mail.jar是JavaMail的參考實(shí)現(xiàn),包括SMTP、IMAP和POP3等常見協(xié)議的實(shí)現(xiàn)。

說明:“自古”傳出的發(fā)郵件需要導(dǎo)入兩個(gè)jar包,中的activtion.jar不是必須的,一個(gè)mail.jar大部分情況下就夠了

值得注意的是:借助Spring發(fā)送郵件,并沒有spring-mail獨(dú)立模塊(相關(guān)類在spring-context-support這個(gè)模塊里),只有Spring Boot提供的spring-boot-starter-mail獨(dú)立啟動(dòng)器。

生存現(xiàn)狀

不可或缺,且已非常成熟。

實(shí)現(xiàn)(框架)

com.sun.mail:javax.mail或者com.sun.mail:jakarta.mail即為官方參考實(shí)現(xiàn),Spring Boot也是使用它來發(fā)送郵件的。

代碼示例

生產(chǎn)環(huán)境當(dāng)然建議使用Spring(or Spring Boot)提供的mail能力來發(fā)送郵件,非常簡(jiǎn)單方便。本文加點(diǎn)料,直接使用底層API來試試。

JavaMail API 按照功能可以劃分為如下三大類:

  1. 創(chuàng)建和解析郵件的API
  2. 發(fā)送郵件的API
  3. 接收郵件的API

這三大類涉及到很多類,但核心的只有4個(gè),也就是俗稱的JavaMail四大核心類。如下圖所示:

絕大部分情況下,我們只需使用JavaMail發(fā)送郵件即可,也就是三個(gè)類:

  • Session:用于定義整個(gè)應(yīng)用程序所需的環(huán)境信息。如主機(jī)名、端口、郵件協(xié)議等等
  • Message:郵件內(nèi)容。通常使用它的子類javax.mail.internet.MimeMessage 類。還有如SMTPMessage、SMTPMessage等等
  • Transport:發(fā)送郵件的核心API 類

下面筆者使用JavaMail API發(fā)送一封郵件到自己的郵箱:yourbatman@aliyun.com,代碼如下。

準(zhǔn)備基礎(chǔ)發(fā)送、接收人元信息:

 
 
 
 
  1. // =====發(fā)送者信息====== 
  2. public static final String SENDER_ADDRESS = "641385712@qq.com"; 
  3. public static final String SENDER_ACCOUNT = "641385712@qq.com"; 
  4. public static final String SENDER_PASSWORD = "xxxxxxxxxxxxx"; // QQ郵箱這里使用授權(quán)碼登錄,而不是密碼哦 
  5. public static final String SENDER_QQ_SMTP_SERVER = "smtp.qq.com"; 
  6. // =====收件人信息====== 
  7. public static final String RECIPIENT_ADDRESS = "yourbatman@aliyun.com"; 

什么是QQ郵箱登錄授權(quán)碼?就是這個(gè)東東(具體怎么獲得,自己用谷歌百度一下):

調(diào)用API,書寫發(fā)送郵件的代碼:

 
 
 
 
  1. /** 
  2.  * 發(fā)送郵件 
  3.  * @param args 
  4.  * @throws Exception 
  5.  */ 
  6. public static void main(String[] args) throws Exception { 
  7.     Properties props = new Properties(); 
  8.     props.setProperty("mail.smtp.auth", "true"); //用戶的認(rèn)證方式 
  9.     props.setProperty("mail.transport.protocol", "smtp"); // 傳輸協(xié)議 
  10.     props.setProperty("mail.smtp.host", SENDER_QQ_SMTP_SERVER); // 發(fā)件人的SMTP服務(wù)器地址 
  11.     Session session = Session.getInstance(props); 
  12.     session.setDebug(true); // 在控制臺(tái)打印調(diào)試信息 
  13.  
  14.     // ======創(chuàng)建一封郵件====== 
  15.     Message msg = createMimeMessage(session); 
  16.     // ======準(zhǔn)備發(fā)送====== 
  17.     Transport transport = session.getTransport(); 
  18.     transport.connect(SENDER_ACCOUNT, SENDER_PASSWORD); 
  19.     transport.sendMessage(msg, msg.getAllRecipients()); // 發(fā)送郵件(包括) 
  20.     //如果只想發(fā)送給指定的人,可以如下寫法 
  21.     //transport.sendMessage(msg, new Address[]{new InternetAddress("xxx@qq.com")}); 
  22.     transport.close(); 
  23.  
  24. private static MimeMessage createMimeMessage(Session session) throws Exception { 
  25.     MimeMessage msg = new MimeMessage(session); 
  26.     msg.setFrom(new InternetAddress(SENDER_ADDRESS)); // 設(shè)置發(fā)件人地址 
  27.     /** 
  28.      * 設(shè)置收件人地址(可以增加多個(gè)收件人、抄送、密送),即下面這一行代碼書寫多行 
  29.      * MimeMessage.RecipientType.TO:發(fā)送 
  30.      * MimeMessage.RecipientType.CC:抄送 
  31.      * MimeMessage.RecipientType.BCC:密送 
  32.      */ 
  33.     msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(RECIPIENT_ADDRESS)); 
  34.     msg.setSubject("我是郵件主題", "UTF-8"); 
  35.     msg.setContent("我是簡(jiǎn)單的純文本郵件!", "text/html;charset=UTF-8"); 
  36.     msg.setSentDate(new Date()); // 郵件的發(fā)送時(shí)間,默認(rèn)立即發(fā)送 
  37.     return msg; 

運(yùn)行程序,收到郵件,完美!

控制臺(tái)的debug日志可以窺探這個(gè)發(fā)送過程:

 
 
 
 
  1. DEBUG: setDebug: Jakarta Mail version 1.6.7 
  2. DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle] 
  3. DEBUG SMTP: useEhlo true, useAuth true 
  4. DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false 
  5. 220 newxmesmtplogicsvrszb6.qq.com XMail Esmtp QQ Mail Server. 
  6. DEBUG SMTP: connected to host "smtp.qq.com", port: 25 
  7. EHLO 192.168.0.145 
  8. 250-newxmesmtplogicsvrszb6.qq.com 
  9. 250-PIPELINING 
  10. 250-SIZE 73400320 
  11. 250-STARTTLS 
  12. 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 
  13. 250-AUTH=LOGIN 
  14. 250-MAILCOMPRESS 
  15. 250 8BITMIME 
  16. DEBUG SMTP: Found extension "PIPELINING", arg "" 
  17. DEBUG SMTP: Found extension "SIZE", arg "73400320" 
  18. DEBUG SMTP: Found extension "STARTTLS", arg "" 
  19. DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2" 
  20. DEBUG SMTP: Found extension "AUTH=LOGIN", arg "" 
  21. DEBUG SMTP: Found extension "MAILCOMPRESS", arg "" 
  22. DEBUG SMTP: Found extension "8BITMIME", arg "" 
  23. DEBUG SMTP: protocolConnect login, host=smtp.qq.com, user=641385712@qq.com, password= 
  24. DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2  
  25. DEBUG SMTP: Using mechanism LOGIN 
  26. DEBUG SMTP: AUTH LOGIN command trace suppressed 
  27. DEBUG SMTP: AUTH LOGIN succeeded 
  28. DEBUG SMTP: use8bit false 
  29. MAIL FROM:<641385712@qq.com> 
  30. 250 OK. 
  31. RCPT TO: 
  32. 250 OK 
  33. DEBUG SMTP: Verified Addresses 
  34. DEBUG SMTP:   yourbatman@aliyun.com 
  35. DATA 
  36. 354 End data with .
  37. Date: Wed, 6 Oct 2021 20:37:54 +0800 (CST) 
  38. From: 641385712@qq.com 
  39. To: yourbatman@aliyun.com 
  40. Message-ID: <683287027.0.1633523875105@[192.168.0.145]> 
  41. Subject: =?UTF-8?B?5oiR5piv6YKu5Lu25Li76aKY?= 
  42. MIME-Version: 1.0 
  43. Content-Type: text/html;charset=UTF-8 
  44. Content-Transfer-Encoding: base64 
  45.  
  46. 5oiR5piv566A5Y2V55qE57qv5paH5pys6YKu5Lu277yB 
  47. 250 OK: queued as. 
  48. DEBUG SMTP: message successfully delivered to mail server 
  49. QUIT 
  50. 221 Bye. 
  51.  
  52. Process finished with exit code 0 

本專欄源代碼:https://github.com/yourbatman/FXP-java-ee

JDBC

Java Data Base Connectivity:Java數(shù)據(jù)庫連接。是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。根本上說JDBC是一種規(guī)范,它提供的接口,一套完整的,允許便捷式訪問底層數(shù)據(jù)庫。

簡(jiǎn)單而言,JDBC就是Java執(zhí)行SQL語句進(jìn)行數(shù)據(jù)庫操作的API。

不同的數(shù)據(jù)庫都有其自己的Driver驅(qū)動(dòng)程序,為了便于開發(fā)者使用,Sun公司出手了:制定JDBC規(guī)范,統(tǒng)一了標(biāo)準(zhǔn)。

  • JDBC無需單獨(dú)導(dǎo)包,包含在Java SE里

版本歷程

在JDK 1.0時(shí)JDBC只是個(gè)可選組件,到JDK 1.1開始成為了Java SE的一部分,也就是java.sql類包。所以:JDBC 1.0是隨著JDK 1.1一起發(fā)布的。

總的來講,JDBC發(fā)展到4.0版本就已經(jīng)非常完善了,使用起來非常的方便。

生存現(xiàn)狀

雖然NoSQL如日中天,但傳統(tǒng)的RDBMS不可或缺,所以JDBC是必備的技能。

實(shí)現(xiàn)(框架)

無。

代碼示例

JDBC不同的版本代碼使用方式不盡相同,下面基于Java 8(也就是JDBC 4.2)來給個(gè)示例。所謂的JDBC四大步驟/四大參數(shù),今天它來啦:

 
 
 
 
  1. /** 
  2.  * 在此處添加備注信息 
  3.  * 
  4.  * @author YourBatman. Send email to me 
  5.  * @site https://yourbatman.cn 
  6.  * @date 2021/10/6 21:20 
  7.  * @since 0.0.1 
  8.  */ 
  9. public class JDBCDemo { 
  10.  
  11.     // ==================JDBC 四大參數(shù) ====================== 
  12.     public static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver"; 
  13.     public static final String DB_URL = "jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC"; 
  14.     public static final String DB_USER = "root"; 
  15.     public static final String DB_PASS = "root"; 
  16.  
  17.     public static void main(String[] args) throws Exception { 
  18.         Class.forName(DB_DRIVER); 
  19.         try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); 
  20.              PreparedStatement pstmt = conn.prepareStatement("SELECT id,name,age FROM user", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY)) { 
  21.  
  22.             // ==============獲取到連接后,即可開始操作數(shù)據(jù)庫================== 
  23.             ResultSet rs = pstmt.executeQuery(); 
  24.  
  25.             //進(jìn)行結(jié)果集滾動(dòng)操作 打印結(jié)果集 
  26.             System.out.println("第二條數(shù)據(jù):" + rs.getLong("id")); 
  27.             rs.absolute(1); 
  28.             System.out.println("第一條數(shù)據(jù):" + rs.getLong("id")); 
  29.             rs.beforeFirst(); 
  30.             System.out.println("最后一條數(shù)據(jù):" + rs.getLong("id")); 
  31.             rs.afterLast(); 
  32.  
  33.             // 關(guān)閉結(jié)果集(應(yīng)該在finally關(guān)閉) 
  34.             rs.close(); 
  35.         } 
  36.     } 

這就是使用原生JDBC操作數(shù)據(jù)庫的簡(jiǎn)單代碼示例。

工程源代碼:https://github.com/yourbatman/FXP-java-ee

總結(jié)

本文通過講解發(fā)展歷程、代碼示例分別介紹了兩項(xiàng)技術(shù):

JavaMail:使用Java語言發(fā)送郵件(還可以接收郵件哦)

JDBC:Java操作數(shù)據(jù)庫的統(tǒng)一抽象層

這里多聊一句:大多數(shù)小伙伴可能覺得使用JDBC操作DB毫無意義,其實(shí)不然!筆者在面試候選人的時(shí)候問JDBC的內(nèi)容還算比較高頻的,我的原因很簡(jiǎn)單:它很重要,是理解MyBatis、Hibernate等框架的內(nèi)核。另外,幾乎每個(gè)候選人簡(jiǎn)歷里都會(huì)寫“對(duì)技術(shù)感興趣”,所以是否真的有“技術(shù)范”總得拉出來遛一遛吧!

本文轉(zhuǎn)載自微信公眾號(hào)「Java方向盤」


標(biāo)題名稱:【方向盤】版本歷史&代碼示例之:JavaMail、JDBC
文章來源:http://www.dlmjj.cn/article/dphshce.html