MySQL的JDBC編程詳解
前言
本文介紹了MySQL數(shù)據(jù)庫(kù)的JDBC操作流程,包括前置知識(shí)、寫(xiě)操作和讀操作的實(shí)現(xiàn)步驟。
內(nèi)容涵蓋:
- 1)如何創(chuàng)建Maven項(xiàng)目并引入MySQL依賴;
- 2)URL格式解析;
- 3)JDBC寫(xiě)操作流程(創(chuàng)建數(shù)據(jù)源、建立連接、構(gòu)造SQL、執(zhí)行更新、釋放資源);
- 4)使用PreparedStatement防止SQL注入;
- 5)JDBC讀操作流程(執(zhí)行查詢、處理ResultSet結(jié)果集)。
文章通過(guò)代碼示例詳細(xì)演示了插入、查詢等基本操作,并強(qiáng)調(diào)了資源釋放的順序和SQL語(yǔ)句參數(shù)化的安全性考慮。
一、前置知識(shí)
1. 引入依賴
創(chuàng)建 Maven 項(xiàng)目,同時(shí)在 Maven Respository 中找到 MySQL 的依賴,在 Maven 項(xiàng)目中引入;
<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. 認(rèn)識(shí) 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ò)上主機(jī)所在的位置;
- 3306 表示端口號(hào),代表操作網(wǎng)絡(luò)的應(yīng)用程序;
- myjdbc 表示數(shù)據(jù)庫(kù)名;
- characterEncoding=utf8 指定字符集為 utf8;
- useSS=false 表示設(shè)置為不加密;
- ? 前面表示資源,后面表示訪問(wèn)資源的參數(shù);
- & 表示參數(shù)間的分隔符,多個(gè)參數(shù)使用這個(gè)符號(hào)分割;
二、JDBC 操作流程
1. JDBC 的寫(xiě)操作
1. 創(chuàng)建數(shù)據(jù)源,設(shè)置好 url,用戶名和密碼;
2. 建立和數(shù)據(jù)庫(kù)服務(wù)器的連接;
3. 構(gòu)造 sql,使用 JDBC 操作數(shù)據(jù)庫(kù)仍然需要手動(dòng)構(gòu)造 sql;
- 構(gòu)造完 sql 之后需要預(yù)處理 sql 語(yǔ)句,目的是檢查 sql 編寫(xiě)是否正確,避免直接發(fā)給服務(wù)器,導(dǎo)致服務(wù)器報(bào)錯(cuò),浪費(fèi)服務(wù)器資源;
- 除了檢查 sql 是否正確,還會(huì)解析 sql 得到結(jié)構(gòu)化的數(shù)據(jù),直接把解析好的結(jié)構(gòu)化數(shù)據(jù)發(fā)給數(shù)據(jù)庫(kù)服務(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ù)庫(kù)中插入數(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ù)庫(kù)服務(wù)器之間的連接
Connection connection = dataSource.getConnection();
// 3. 構(gòu)造 sql
String sql = "insert into student values(1, '張三')";
// 預(yù)處理 sql 語(yǔ)句
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 把 sql 發(fā)給服務(wù)器
int n = statement.executeUpdate();
// 5. 關(guān)閉連接,釋放資源
statement.close();
connection.close();
}
}更新和刪除記錄的操作和插入的操作步驟相同,只需要更改 sql 語(yǔ)句;
注意:
為了解決 sql 寫(xiě)死的問(wèn)題,代碼中的 sql 是可以拼接參數(shù)的;
但是字符串中拼接上參數(shù),容易被注入 sql 攻擊,為了避免被注入 sql,可以使用占位符 “?”,再調(diào)用 PreparedStatement 的 setInt(), setString() 等方法進(jìn)行替換;
// 3. 構(gòu)造 sql
//String sql = "insert into student values(" + id + ", '" + name +"')";
String sql = "insert into student values (?, ?)";
// 預(yù)處理 sql 語(yǔ)句 - 檢查 sql 是否存在問(wèn)題
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);2. JDBC 的讀操作
讀操作和寫(xiě)操作的主要區(qū)別:
1. sql 語(yǔ)句:需要編寫(xiě)查詢語(yǔ)句;
2. 執(zhí)行 sql 的方法:executeQuery();
3. 執(zhí)行 sql 語(yǔ)句的返回值:返回的結(jié)果集的類型為 ResultSet;
- ResultSet 默認(rèn)指向第 0 行記錄的前一個(gè)位置,調(diào)用 next() 方法,才會(huì)指向第 0 行記錄;
- 如果 next() 指向的地方有數(shù)據(jù)記錄,返回 true,否則返回 false;
4. 獲取數(shù)據(jù)記錄的列需要使用 getInt(),getString() 等方法,取決于列的數(shù)據(jù)類型,括號(hào)中填寫(xiě)要獲取臨時(shí)表的列名,如果使用別名,就寫(xiě)別名;
5. 關(guān)閉資源時(shí),要注意關(guān)閉 ResultSet,因?yàn)?ResultSet 是最后打開(kāi)的,因此要最先關(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. 編寫(xiě) sql 語(yǔ)句
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 執(zhí)行 sql 語(yǔ)句
ResultSet resultSet = statement.executeQuery();
// 5. 遍歷結(jié)果集合
// 通過(guò) next() 方法,可以獲取臨時(shí)表的每一行數(shù)據(jù),執(zhí)行到最后一行的下一行會(huì)返回 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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL中int(10)和int(11)的區(qū)別詳解
本文主要介紹了MySQL中int(10)和int(11)的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
關(guān)于JDBC與MySQL臨時(shí)表空間的深入解析
這篇文章主要給大家介紹了關(guān)于JDBC與MySQL臨時(shí)表空間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)統(tǒng)計(jì)所有表的空間占用與行數(shù)
這篇文章主要為大家詳細(xì)介紹了MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)統(tǒng)計(jì)所有表的空間占用與行數(shù)的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-02-02
Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表
在Mysql的范圍分區(qū)表定義中,分區(qū)范圍需要連續(xù)并且不會(huì)有覆蓋,定義范圍分區(qū)表時(shí),使用VALUES LESS THAN操作符,這篇文章主要介紹了Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表,需要的朋友可以參考下2024-08-08
Mysql常見(jiàn)bug及解決方案超詳細(xì)講解
在使用MySQL的過(guò)程中,相比大家都踩過(guò)不少坑,下面這篇文章主要給大家介紹了關(guān)于Mysql常見(jiàn)bug及解決方案超詳細(xì)講解的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06

