MySQL的JDBC編程詳解
前言
本文介紹了MySQL數(shù)據(jù)庫的JDBC操作流程,包括前置知識、寫操作和讀操作的實現(xiàn)步驟。
內(nèi)容涵蓋:
- 1)如何創(chuàng)建Maven項目并引入MySQL依賴;
- 2)URL格式解析;
- 3)JDBC寫操作流程(創(chuàng)建數(shù)據(jù)源、建立連接、構(gòu)造SQL、執(zhí)行更新、釋放資源);
- 4)使用PreparedStatement防止SQL注入;
- 5)JDBC讀操作流程(執(zhí)行查詢、處理ResultSet結(jié)果集)。
文章通過代碼示例詳細演示了插入、查詢等基本操作,并強調(diào)了資源釋放的順序和SQL語句參數(shù)化的安全性考慮。
一、前置知識
1. 引入依賴
創(chuàng)建 Maven 項目,同時在 Maven Respository 中找到 MySQL 的依賴,在 Maven 項目中引入;
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>2. 認識 url
url 是資源在網(wǎng)路上的位置;
以下面 url 為例:
jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSS=false
- jdbc:mysql 表示 url 的作用,是給 jdbc 操作 mysql 的;
- 127.0.0.1 表示 IP 地址,描述網(wǎng)絡(luò)上主機所在的位置;
- 3306 表示端口號,代表操作網(wǎng)絡(luò)的應(yīng)用程序;
- myjdbc 表示數(shù)據(jù)庫名;
- characterEncoding=utf8 指定字符集為 utf8;
- useSS=false 表示設(shè)置為不加密;
- ? 前面表示資源,后面表示訪問資源的參數(shù);
- & 表示參數(shù)間的分隔符,多個參數(shù)使用這個符號分割;
二、JDBC 操作流程
1. JDBC 的寫操作
1. 創(chuàng)建數(shù)據(jù)源,設(shè)置好 url,用戶名和密碼;
2. 建立和數(shù)據(jù)庫服務(wù)器的連接;
3. 構(gòu)造 sql,使用 JDBC 操作數(shù)據(jù)庫仍然需要手動構(gòu)造 sql;
- 構(gòu)造完 sql 之后需要預處理 sql 語句,目的是檢查 sql 編寫是否正確,避免直接發(fā)給服務(wù)器,導致服務(wù)器報錯,浪費服務(wù)器資源;
- 除了檢查 sql 是否正確,還會解析 sql 得到結(jié)構(gòu)化的數(shù)據(jù),直接把解析好的結(jié)構(gòu)化數(shù)據(jù)發(fā)給數(shù)據(jù)庫服務(wù)器,服務(wù)器就省下了這部分解析的工作;
4. 把 sql 發(fā)給服務(wù)器,服務(wù)器返回受到影響的行數(shù);
5. 關(guān)閉連接,釋放資源;先獲得的資源后釋放,后獲得的資源先釋放;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
// 在數(shù)據(jù)庫中插入數(shù)據(jù)
public class Demo1 {
public static void main(String[] args) throws SQLException {
// 1. 創(chuàng)建數(shù)據(jù)源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");
// 設(shè)置用戶名和密碼
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
// 2. 建立和數(shù)據(jù)庫服務(wù)器之間的連接
Connection connection = dataSource.getConnection();
// 3. 構(gòu)造 sql
String sql = "insert into student values(1, '張三')";
// 預處理 sql 語句
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 把 sql 發(fā)給服務(wù)器
int n = statement.executeUpdate();
// 5. 關(guān)閉連接,釋放資源
statement.close();
connection.close();
}
}更新和刪除記錄的操作和插入的操作步驟相同,只需要更改 sql 語句;
注意:
為了解決 sql 寫死的問題,代碼中的 sql 是可以拼接參數(shù)的;
但是字符串中拼接上參數(shù),容易被注入 sql 攻擊,為了避免被注入 sql,可以使用占位符 “?”,再調(diào)用 PreparedStatement 的 setInt(), setString() 等方法進行替換;
// 3. 構(gòu)造 sql
//String sql = "insert into student values(" + id + ", '" + name +"')";
String sql = "insert into student values (?, ?)";
// 預處理 sql 語句 - 檢查 sql 是否存在問題
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);2. JDBC 的讀操作
讀操作和寫操作的主要區(qū)別:
1. sql 語句:需要編寫查詢語句;
2. 執(zhí)行 sql 的方法:executeQuery();
3. 執(zhí)行 sql 語句的返回值:返回的結(jié)果集的類型為 ResultSet;
- ResultSet 默認指向第 0 行記錄的前一個位置,調(diào)用 next() 方法,才會指向第 0 行記錄;
- 如果 next() 指向的地方有數(shù)據(jù)記錄,返回 true,否則返回 false;
4. 獲取數(shù)據(jù)記錄的列需要使用 getInt(),getString() 等方法,取決于列的數(shù)據(jù)類型,括號中填寫要獲取臨時表的列名,如果使用別名,就寫別名;
5. 關(guān)閉資源時,要注意關(guān)閉 ResultSet,因為 ResultSet 是最后打開的,因此要最先關(guān)閉;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
// jdbc 查詢
public class Demo2 {
public static void main(String[] args) throws SQLException {
// 1. 創(chuàng)建數(shù)據(jù)源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
// 2. 建立連接
Connection connection = dataSource.getConnection();
// 3. 編寫 sql 語句
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 執(zhí)行 sql 語句
ResultSet resultSet = statement.executeQuery();
// 5. 遍歷結(jié)果集合
// 通過 next() 方法,可以獲取臨時表的每一行數(shù)據(jù),執(zhí)行到最后一行的下一行會返回 false
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + ", name = " + name);
}
// 6. 釋放資源
resultSet.close();
statement.close();
connection.close();
}
}注意:讀操作同樣可以使用占位符,后續(xù)用變量去替換;
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
登錄MySQL時出現(xiàn)SSL connection error: unknown
這篇文章主要介紹了登錄MySQL時出現(xiàn)SSL connection error: unknown error number錯誤的解決方法,文中通過圖文結(jié)合的形式講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-12-12
如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog
這篇文章主要介紹了如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2021-02-02
MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因
這篇文章主要介紹了MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因,幫助大家更好的理解MySQL中的數(shù)據(jù)表,感興趣的朋友可以了解下2020-10-10
MySQL 使用 Performance Schema 定位和解決慢
本文介紹了如何使用MySQL的PerformanceSchema來定位和解決慢SQL查詢問題,通過啟用PerformanceSchema并分析相關(guān)的系統(tǒng)表,可以收集到詳細的性能數(shù)據(jù),從而識別出影響性能的SQL語句,優(yōu)化策略包括優(yōu)化查詢語句、調(diào)整數(shù)據(jù)庫配置等2025-02-02
使用mysqldump導入數(shù)據(jù)和mysqldump增量備份(mysqldump使用方法)
mysqldump常用于MySQL數(shù)據(jù)庫邏輯備份,下面看實例吧2013-12-12

