Java 代碼能夠實現將數據保存在變量、數組、集合等內存空間中,但這只是暫時保存,如果想要長期保存該怎麼辦呢?方法一,藉助 IO 流將數據寫入文件,不足之處是不方便管理數據以及維護數據的關係。方法二,藉助數據庫管理軟件,比如 MySQL,相對來説它可以更方便地管理數據。
既然如此,我們是否可以集二者之所長,將其結合起來呢?即 Java 程序操作 MySQL,實現數據的存儲和處理。也就是使用 JDBC 技術實現數據持久化,後期可以使用 MyBatis 等持久層框架,其底層仍然使用了 JDBC 技術。 JDBC是什麼 JDBC 代表一組獨立於任何數據庫管理系統(DBMS)的 API,聲明在 java.sql 與 javax.sql 包中,是 Sun (現 Oracle)公司提供的一組接口規範。它由各個數據庫廠商來提供實現類,這些實現類的集合構成了數據庫驅動 jar 包。
Java 程序調用 JDBC 技術,然後通過 JDBC 技術調用數據庫實現數據持久化的全過程,如下圖所示:
圖 1 藉助 JDBC 實現數據持久化
通過 Java 程序對 MySQL 進行操作,主要分為兩部分: 一是創建 Java 程序,並建立與 MySQL 數據庫的連接; 二是通過 JDBC 對 MySQL 數據庫進行增刪改查的操作。
接下來為大家介紹如何藉助 Java 程序連接 MySQL 數據庫。 Java程序連接MySQL數據庫 藉助 Java 程序連接 MySQL 數據庫,具體步驟如下: 新建一個 Java 模塊,例如命名為 chapter07_JdbcTest; 在該模塊路徑下新建一個名稱為 lib 的目錄; 將 MySQL 的驅動包“commons-dbutils-1.4.jar”複製、粘貼到 lib 目錄下,並在驅動包上右鍵選擇“Add as Library”引入該依賴; 在 MySQL 內創建 atguigu 數據庫,通過編寫 Java 代碼實現與該數據庫的連接。
chapter07_JdbcTest 項目的目錄結構,如下圖所示:
圖 2 chapter07_JdbcTest項目的目錄結構
創建 JdbcTest 類,編寫如下代碼連接 atguigu 數據庫,示例代碼如下: package com.atguigu; import java.sql.Connection; import java.sql.DriverManager; public class JdbcTest { public static void main(String[] args) throws Exception { // 1. 加載驅動 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 設置連接數據庫的參數 String url = "jdbc:mysql://localhost:3306/atguigu"; // 用户名,採用 root 用户登錄 String username = "root"; // 密碼,root 用户的密碼(安裝數據庫時設置的密碼) String password = "root"; // 3. 獲得數據庫連接 Connection connection = DriverManager.getConnection(url, username, password); // 4. 輸出驗證結果是否成功 System.out.println("connection = " + connection); } } 綜上可知,連接數據庫具體分為三步,首先加載驅動,然後設置參數,即指明 url、用户名和密碼。其中 url 包括需要連接的數據庫的類型“mysql”、對應的 IP 地址“localhost”、端口號 3306,以及數據庫名字“atguigu”。最後傳遞上述參數進行連接即可。
運行上述代碼查看控制枱,如下圖所示,表示連接成功:
圖 3 查看控制枱是否成功連接數據庫 JDBC進行增刪改查 成功連接數據庫並獲取數據庫連接對象後,下面繼續介紹如何實現對 MySQL 數據庫的增刪改查操作。
首先,在 atguigu 數據庫中創建一個表,命名為 users,users 表結構如下表所示:
表:users表結構 字段名稱 數據類型 Key 用户編號 id INT PRI 用户名 username VARCHAR(20) 密碼 password VARCHAR(50) 郵箱 email VARCHAR(50)
下面編寫 Java 代碼,藉助 JDBC 技術實現對該表的數據進行增刪改查操作。
- 新增數據 創建 InsertTest 類,實現新增數據的操作,示例代碼如下: package com.atguigu; //省略 import 語句 public class InsertTest { public static void main(String[] args) throws Exception { //省略獲取數據庫連接代碼... //將數據添加到 users 表格內 //準備帶有佔位符的 sql 語句(後期可以避免 sql 語句的拼接和 sql 問題) String sql = "insert into users(username,password,email) values(?,?,?)"; //獲得 PreparedStatement 對象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //為 sql 語句綁定參數(也就是佔位符?位置的數據) /* * 值得注意的是 setObject 方法可以綁定任意類型的參數,第一個參數的含義是第幾個問號,第二個參數就是參數值, * 參數的個數一定要和問號的個數保持一致,否則會出現錯誤 */ preparedStatement.setObject(1, "cyuyan"); preparedStatement.setObject(2, "12345"); preparedStatement.setObject(3, "cyuyan@qq.com"); } } 運行代碼查看控制枱,如下圖所示:
圖 4 成功新增數據
查看數據庫的 users 表,發現表中多了一條記錄,如下圖所示:
圖 5 users表中新增一條數據 2) 更新數據 創建 UpdateTest 類,實現修改數據的操作,示例代碼如下: package com.atguigu; //省略 import 語句 public class UpdateTest { public static void main(String[] args) throws Exception { //省略獲取數據庫連接代碼... //對 users 表內的數據進行修改 //準備帶有佔位符的 sql 語句 String sql = "update users set username=?, password=?, email=? where id=?"; //獲得 PreparedStatement 對象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //為 sql 語句綁定參數 preparedStatement.setObject(1, "Cyuyan"); preparedStatement.setObject(2, "12345"); preparedStatement.setObject(3, "cyuyan@qq.com"); preparedStatement.setObject(4, 1); //執行,返回值為 sql 語句影響的行數 int len = preparedStatement.executeUpdate(); System.out.println(len > 0 ? "修改成功" : "修改失敗"); //關閉資源 preparedStatement.close(); connection.close(); } } 運行代碼查看控制枱,如下圖所示:
圖 6 成功修改數據
查看數據庫 users 表,發現用户名由“cyuyan”修改為“Cyuyan”,如下圖所示:
圖 7 修改用户名“cyuyan”為“Cyuyan” 3) 查詢數據 創建 QueryTest 類實現查詢數據的操作,示例代碼如下: package com.atguigu; //省略 import 語句 public class QueryTest { public static void main(String[] args) throws Exception { //省略獲取數據庫連接代碼... //對 users 表內的數據進行查詢 //準備帶有佔位符的 sql 語句 String sql = "select * from users where id=?"; //獲得 PreparedStatement 對象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //為 sql 語句綁定參數 preparedStatement.setObject(1, 1); //執行,返回值為 sql 語句的查詢結果 ResultSet resultSet = preparedStatement.executeQuery(); //處理結果集 //如果 sql 語句的查詢結果是多條的話,將 if 換成 while 即可 if(resultSet.next()){ int id = resultSet.getInt("id");//獲取 id 列的數據 System.out.println("id = " + id); String username = resultSet.getString("username"); System.out.println("username1 = " + username); String password1 = resultSet.getString("password"); System.out.println("password1 = " + password1); String email = resultSet.getString("email"); System.out.println("email = " + email); } //關閉資源 preparedStatement.close(); connection.close(); } } 運行代碼查看控制枱,如下圖所示:
圖 8 成功查詢數據
成功查詢到 users 表中的數據。 4) 刪除數據 創建 DeleteTest 類,實現刪除數據的操作,示例代碼如下: package com.atguigu; //省略 import 語句 public class DeleteTest { public static void main(String[] args) throws Exception { //省略獲取數據庫連接代碼... //對 users 表內的數據進行刪除操作 //準備帶有佔位符的 sql 語句 String sql = "delete from users where id=?"; //獲得 PreparedStatement 對象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //為 sql 語句綁定參數 preparedStatement.setObject(1, 1); //執行,返回值為 sql 語句影響的行數 int len = preparedStatement.executeUpdate(); System.out.println(len > 0 ? "刪除成功" : "刪除失敗"); //關閉資源 preparedStatement.close(); connection.close(); } } 運行代碼,查看控制枱,如下圖所示:
圖 9 成功刪除數據
查看數據庫 users 表,發現表中的數據被刪除了。再次啓動 QueryTest 類進行查詢,查看控制枱,如下圖所示,結果為空。