序
歡迎來到全網最完整的Java系列教程!!!
本教程将包含基礎知識、進階知識、常用架構等,循序漸進地分享Java中必須掌握的知識和技術。跟着老K的教程每天學習一點,你會發現入門Java沒有想象中那麼難。
說到Java的常見架構,JDBC一定是榜上有名。雖然大多數人會使用mybatis來做Java應用和MySQL之間的資料互動,但了解JDBC依然是一個Java工程師必備的基本功。
本期教程内容,我們就要通過實戰,向大家介紹一下JDBC這個架構。
如果你正在學習Java,不妨收藏這篇文章,或者關注我,定期收獲與Java有關的知識和項目資訊!
1. 準備工作
1.1 下載下傳安裝JDK和IDEA
這應該是Java基礎中的基礎了,就不做詳細展開了,有需要的小夥伴可以到我之前的文章了解相關知識:
全網最完整的免費java教程講義(一)——java配置和安裝
1.2 下載下傳mysql-connector-j
JDBC是Java DataBase Connectivity的首字母縮寫,它是MySQL對各個平台、語言的驅動程式,具體檔案包可以從MySQL的官網下載下傳:https://dev.mysql.com/downloads/。
我們學習java,需要下載下傳和安裝的自然是java的版本——connector/j
點選圖中相應連結,在新頁面中,運作系統選擇Ubuntu Linux
在重新整理後的頁面中,選擇合适的安裝包:
重要說明: 下載下傳版本不是越新越好,新版本可能會存在相容和解壓問題,如果遇到打不開,可以換另外幾個版本DEB Package 試試。
1.3 下載下傳mysql-connector-j
我們之後會用到的JDBC架構就在這個mysql-connector-j的安裝包裡。
用解壓工具,将jar包解壓,找到該路徑下的檔案./data.jar/./usr/share/java/mysql-connector-j-8.0.xx.jar
将該路徑下的mysql-connector-j-8.0.xx.jar檔案複制到java項目下即可。
一般我們會在項目根目錄下建立一個"lib"檔案夾,将mysql-connector-j-8.0.xx.jar包拷貝到該檔案夾下
1.4 引用綁定jdbc
本例以IDEA編譯器的配置為例,其它平台的引用綁定,我會在後續的文章裡逐漸更新。有需要的小夥伴可以先關注我哦!
在IDEA中建立項目後,在菜單欄裡選擇File->Project Structure
依上圖逐個點選按鈕,點選JARs or Directories ,打開資料總管視窗,找到我們剛才從MySQL官網下載下傳下來的mysql-connector-j-8.0.xx.jar,點選确定完成引用和綁定。
1.5 MySQL資料庫
這裡僅作為提示:後續的内容是建立在配置好MySQL資料庫的基礎上。
由于MySQL本身就是一項獨立技術,是以在此不展開介紹。
有需要的話,我會在後續的文章介紹MySQL,或者專門開辟一個關于MySQL知識分享的專欄,大家可以關注一下。
2. 代碼實作
2.1 基本邏輯實作
完成了上述準備工作,我們就可以開始落實代碼了。
JDBA的使用,本質上和我之前I/O檔案讀寫的邏輯是一緻的,可以參考:「Java進階」I/O操作必備知識點:位元組流讀寫執行個體講解
- 執行個體化驅動和資料庫連接配接
- 查詢對象
- 關閉連接配接
在IDEA項目中,建立一個檔案,并将下述代碼複制進去,運作學習:
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
// 1. 執行個體化資源
// 1.1 注冊JDBC驅動
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.2 建立資料庫連接配接執行個體
String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String user = "root";
String pswd = "root";
Connectionconn = DriverManager.getConnection(url, user, pswd);
// 2. 查詢對象
// 2.1 執行個體話查詢聲明,以及查詢語句
Statement st = conn.createStatement();
String query = "select * from table1";
ResultSet rs = st.executeQuery(query);
// 2.2. 查詢結果
while (rs.next()) {
int uid = rs.getInt(1);
System.out.println(uid);
}
// 3. 關閉連接配接,釋放資源
conn.close();
}
}
說明:
- 上例中的url、user、pswd是連接配接資料庫的參數,分别是路徑、使用者名、密碼;
- 稍微對上例中的url(資料庫路徑)的文法做一下解釋:驅動名:SQL方言名://伺服器:端口号/資料庫名?連接配接參數,一般連接配接參數按照上例寫即可;
- String query是MySQL查詢語句,請結合自己的MySQL資料庫編寫查詢語句。
2.2 完整代碼實作
上例中的代碼,沒有做異常處理,為的是減低代碼的閱讀難度,幫助小夥伴理清JDBC執行個體的脈絡,完整代碼應該是這樣的:
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null;
try {
// 1. 執行個體化資源
// 1.1 注冊JDBC驅動
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.2 建立資料庫連接配接執行個體
String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String user = "root";
String pswd = "root";
conn = DriverManager.getConnection(url, user, pswd);
// 2. 查詢對象
// 2.1 執行個體話查詢聲明,以及查詢語句
Statement st = conn.createStatement();
String query = "select * from table1";
ResultSet rs = st.executeQuery(query);
// 2.2. 查詢結果
while (rs.next()) {
int uid = rs.getInt(1);
System.out.println(uid);
}
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
} finally {
// 3. 關閉連接配接,釋放資源
try {
if (conn != null & !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
說明:
finally代碼塊中的if判斷,是避免conn空指針異常導緻關閉連接配接失敗的情況。
2.3 防SQL注入攻擊
不過,上述代碼會有一定風險,可能會有SQL注入攻擊的風險。 為了避免SQL注入攻擊的風險,我們隻需要做一個調整即可,詳見下例:
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null;
try {
// 1. 執行個體化資源
// 1.1 注冊JDBC驅動
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.2 建立資料庫連接配接執行個體
String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String user = "root";
String pswd = "root";
conn = DriverManager.getConnection(url, user, pswd);
// 2. 查詢對象
// 2.1 執行個體話查詢聲明,以及查詢語句
String query = "select * from table1";
PreparedStatement st = conn.prepareStatement(query);
ResultSet rs = st.executeQuery(query);
// 2.2. 查詢結果
while (rs.next()) {
int uid = rs.getInt(1);
System.out.println(uid);
}
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
} finally {
// 3. 關閉連接配接,釋放資源
try {
if (conn != null & !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
說明:
- 在這裡,我們将Statement st = conn.createStatement();更改為PreparedStatement st = conn.prepareStatement(query);即可;
- PreparedStatement是Statement的子類,但它會對傳入的查詢語句進行解析,然後再向資料庫發起請求,進而避免SQL注入攻擊的風險。
關于JDBC的知識點和執行個體示範就先分享到這裡。
本期的内容較多,建議可以收藏這篇文章,多讀幾遍慢慢消化。
如果你對老K分享的内容有任何疑問,歡迎随時在評論區留言或者私信我。
正在學習的小夥伴記得給老K一個贊哦,你的支援是我持續輸出課程内容最大的動力!
閱讀推薦
我也分享過關于如何學習Java的文章,有需要的小夥伴可以點選下方連結擷取:
IT大佬推薦!學習Java的最優路徑 分享多個階段的學習資源 建議收藏
結束語
我是專注于開發領域的@老K玩代碼,會持續生産關于如何學習程式設計語言的優質内容。
如果你想學習Java程式設計,或者想精進你的Java程式設計能力,可以關注我。
如果你對開發、程式設計有任何疑問或者有想了解的内容,而我暫時沒有寫到的,也歡迎随時來找我聊聊。
#頭條創作挑戰賽#