前言:?
在學(xué)完 MySQL 和 Java 后,我們通常會(huì)嘗試使用 Java編譯器 連接 MySQL數(shù)據(jù)庫(kù),從而達(dá)到使用編譯器來(lái)操作數(shù)據(jù)庫(kù)的效果。連接的這個(gè)過(guò)程會(huì)用 JDBC 相關(guān)知識(shí),因此我把 JDBC 包的下載及導(dǎo)入流程,以及 JDBC 的使用流程整理下來(lái)分享給大家。
目錄
1. 啥是JDBC?
2. JDBC依賴包
2.1 依賴包下載流程
2.2 導(dǎo)入依賴包
3. JDBC常用的接口和類
3.1 Connection接口
3.2 Statement對(duì)象
3.3 ResultSet對(duì)象
4. JDBC的使用
4.1 創(chuàng)建并初始化數(shù)據(jù)源
4.2 與數(shù)據(jù)庫(kù)服務(wù)器建立連接
4.3 構(gòu)造sql語(yǔ)句
4.4 執(zhí)行sql語(yǔ)句
4.5 遍歷結(jié)果集
4.6?釋放資源?
4.7 最終效果展示
1. 啥是JDBC?
JDBC 翻譯中文為 Java數(shù)據(jù)庫(kù)連接,通俗的來(lái)講,JDBC 就是能使 Java 連接關(guān)于數(shù)據(jù)庫(kù)的一個(gè)API。這個(gè) API 是由 java.sql.* 和 jva.sql.* 包中的接口和類組成的。
API在此做個(gè)簡(jiǎn)單的介紹,有的人認(rèn)為它是一個(gè)接口可以這樣去說(shuō),更好的理解為它是多個(gè)特定模塊封裝起來(lái)的一個(gè)功能包。而在本文中 JDBC 就是 Java 操縱數(shù)據(jù)庫(kù)的一個(gè)API。
2. JDBC依賴包
在使用 JDBC 之前,我們必需把依賴包 mysql-connector-java-5.1.47.jar 導(dǎo)入到 Java 項(xiàng)目中。依賴包的獲取方式:GitHub、MySQL官網(wǎng)、maven倉(cāng)庫(kù)。但 GitHub 有些慢,MySQL官網(wǎng)不好找,因此推薦在 maven倉(cāng)庫(kù) 中下載。
上述依賴包的版本號(hào)5.1.47,以大版本號(hào)為主,小版本號(hào)無(wú)所謂。什么意思?就是你下載的MySQL版本是 5 你就下載依賴包以 5 開頭的版本,至于是5.幾都可以。?
2.1 依賴包下載流程
第一步,瀏覽器搜索maven倉(cāng)庫(kù)。
第二步,在搜索框搜索 mysql 并進(jìn)入MySQL Connector Java。
第三步,進(jìn)入MySQL Connector Java后,找到 5 開頭的版本。為啥呢,你下載的MySQL是版本幾就下版本幾。因?yàn)椴┲饔肕ySQL是 5 版本的,因此下載 5 開頭的都行。
?第四步,進(jìn)入MySQL Connector Java 》5.1...后,點(diǎn)擊jar下載即可。
2.2 導(dǎo)入依賴包
下載好依賴包后,我們直接把依賴包 mysql-connector-java-5.1.47 復(fù)制并粘貼到Java項(xiàng)目當(dāng)中,具體操作流程如下:
第一步,將下載好的.jar文件復(fù)制。
第二步,將復(fù)制好的 mysql-connector-java-5.1.47.jar 文件粘貼至創(chuàng)建好的項(xiàng)目當(dāng)中,以項(xiàng)目中出現(xiàn)該.jar文件為準(zhǔn)代表粘貼成功。
第三步,右擊粘貼好的 mysql-connector-java-5.1.47.jar 文件,修改為L(zhǎng)ibray。點(diǎn)擊Add as Library即可。
?第四步,mysql-connector-java-5.1.47.jar 文件下出現(xiàn)三個(gè)子目錄,代表著導(dǎo)入成功。
在把依賴包導(dǎo)入到項(xiàng)目當(dāng)中后,我們就能安心的使用 JDBC 進(jìn)行編程了。下面我就來(lái)講解關(guān)于 JDBC 的使用方法。
3. JDBC常用的接口和類
在JDBC常用的接口和類這節(jié)講解中,大家很多地方可能第一時(shí)間不能夠很好的理解。建議跳過(guò),先看4. JDBC的使用后,在回來(lái)看這一小節(jié)。
3.1 Connection接口
數(shù)據(jù)庫(kù)連接 接口即 Connection 接口實(shí)現(xiàn)類是由數(shù)據(jù)庫(kù)提供的,獲取到Connection對(duì)象的最合適的方法為:
是通過(guò)DataSource(數(shù)據(jù)源)對(duì)象來(lái)獲取,如下代碼的展示:
//實(shí)例化MysqlDataSource對(duì)象(向上轉(zhuǎn)型)
DataSource datasource = new MysqlDataSource();
((MysqlDataSource) datasource).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) datasource).setUser("root");
((MysqlDataSource) datasource).setPassword("填你的密碼");
//創(chuàng)建來(lái)連接數(shù)據(jù)庫(kù)
Connection connection = datasource.getConnection();
以上代碼,就是連接Java連接數(shù)據(jù)庫(kù)的操作。具體的實(shí)現(xiàn)的原理,在下方4. JDBC的使用中有詳細(xì)介紹。
解釋:?
DataSource提供連接池的支持。連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)連接,這些連接是可以復(fù)用的,每次使用完數(shù)據(jù)庫(kù)連接,釋放資源調(diào)用 connection.close() 都是將Conncetion連接對(duì)象回收。
3.2 Statement對(duì)象
Statement對(duì)象是將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中。JDBC 這個(gè) API 中提供了三種Statement對(duì)象:
(1)Statement對(duì)象:
- 用于執(zhí)行不帶參數(shù)的簡(jiǎn)單SQL語(yǔ)句
(2)PreparedStatement對(duì)象:
- 用于執(zhí)行帶或者不帶參數(shù)的SQL語(yǔ)句
- SQL語(yǔ)句會(huì)編譯在數(shù)據(jù)庫(kù)系統(tǒng)
- 執(zhí)行速度快于Statement對(duì)象
(3)CallableStatement對(duì)象:
- 用于執(zhí)行數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的調(diào)用
綜上所述,我們?cè)趯?shí)際開發(fā)中最常用的就是?PreparedStatement對(duì)象?。 因此我們?cè)趯?shí)例化PreparedStatement對(duì)象時(shí)一般這樣操作:
PreparedStatement statement = connection.prepareStatement(sql);
在上述代碼中,connection為Connection類型的引用,prepareStatement方法則是把Java編寫的SQL語(yǔ)句傳入MySQL數(shù)據(jù)庫(kù)。
3.3 ResultSet對(duì)象
ResultSet里的數(shù)據(jù)一行一行排列,每行有多個(gè)字段,并且有一個(gè)記錄指針,指針?biāo)傅臄?shù)據(jù)行叫做當(dāng)前數(shù)據(jù)行,我們只能來(lái)操作當(dāng)前的數(shù)據(jù)行。我們?nèi)绻胍〉媚骋粭l記錄,就要使用ResultSet的 next() 方法 ,如果我們想要得到 ResultSet 里的所有記錄,就應(yīng)該使用 while 循環(huán)。
如下圖所示,next方法 第一次獲取第一行數(shù)據(jù),第二次獲取第二行數(shù)據(jù),直到最后沒(méi)有數(shù)據(jù)了 while 循環(huán)結(jié)束。
executeQuery()方法 會(huì)把數(shù)據(jù)庫(kù)響應(yīng)的查詢結(jié)果存放在 ResultSet對(duì)象 中供我們使用。
語(yǔ)法為:ResultSet? 引用名 = new PreparedStatement類型的引用.executeQuery();因此,可以這樣去寫代碼:
PreparedStatement statement = connection.prepareStatement(sql);//把sql語(yǔ)句傳入數(shù)據(jù)庫(kù)
String sql = "select * from student";//寫入sql語(yǔ)句
ResultSet resultSet = statement.executeQuery();//實(shí)例化Resultset類型的對(duì)象
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = "+id+" name = "+name);
}//遍歷表中信息
在對(duì)結(jié)果集進(jìn)行遍歷的時(shí)候,while循環(huán)里面的參數(shù)是根據(jù)數(shù)據(jù)表中字段來(lái)確定的。如果數(shù)據(jù)表里面的字段有int,varchar 這兩個(gè)類型那么我們就使用 getInt方法、getString方法 來(lái)分別獲取這兩個(gè)字段。當(dāng)然必需得是 ResultSet類型 的引用。如果表中數(shù)據(jù)是其他類型,則按照 getXXX方法 來(lái)獲取即可。
4. JDBC的使用
在了解到了 JDBC 的常見(jiàn)接口與對(duì)象后,我們就可以使用 JDBC 來(lái)進(jìn)行編程了。JDBC 的使用步驟如下:
- 創(chuàng)建并初始化一個(gè)數(shù)據(jù)源
- 與數(shù)據(jù)庫(kù)服務(wù)器建立連接
- 構(gòu)造 SQL 語(yǔ)句
- 執(zhí)行 SQL 語(yǔ)句
- 遍歷結(jié)果集
- 釋放必要的資源
首先,我們?cè)跀?shù)據(jù)中創(chuàng)建一個(gè)名為 test 的數(shù)據(jù)庫(kù)并在該數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為 student 的表:
//創(chuàng)建test數(shù)據(jù)庫(kù)
mysql> create database test charset utf8;
Query OK, 1 row affected (0.00 sec)
//使用test數(shù)據(jù)庫(kù)
mysql> use test;
Database changed
//創(chuàng)建student表
mysql> create table student(
-> id int,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
//查詢?nèi)韮?nèi)容
mysql> select * from student;
Empty set (0.00 sec)
此時(shí)的 student 表中沒(méi)有任何數(shù)據(jù),下方我們來(lái)通過(guò) JDBC 編程使 student 增添數(shù)據(jù)。
4.1 創(chuàng)建并初始化數(shù)據(jù)源
MysqlDataSource 是 MySQL的數(shù)據(jù)源,因此我們得實(shí)例化一個(gè) MysqlDataSource 。
當(dāng)然,我們一般使用 DataSource類 來(lái)實(shí)例化 MysqlDataSource,因此會(huì)進(jìn)行向上轉(zhuǎn)型效果。
DataSource dataSource = new MysqlDataSource();//向上轉(zhuǎn)型
為啥不直接使用 MysqlDataSource類型?來(lái)實(shí)例化呢?這樣去理解:DataSource類里面有的方法DataSource類的引用能夠使用用,MysqlDataSource里面有的方法DataSource類型的引用也能夠用。因此,我們寧愿向上轉(zhuǎn)型。
4.2 與數(shù)據(jù)庫(kù)服務(wù)器建立連接
Java 與 MySQL數(shù)據(jù) 連接的URL參數(shù)格式如下:
- jdbc:mysql://服務(wù)器地址:端口/數(shù)據(jù)庫(kù)名?參數(shù)名=參數(shù)值
萬(wàn)能的URL:jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false
以上的URL大家可以直接復(fù)制粘貼使用即可,唯一需要更改的是數(shù)據(jù)庫(kù)名。把 test 更改為你所要操作的數(shù)據(jù)庫(kù)。如下方連接我創(chuàng)建的 test 數(shù)據(jù)庫(kù)。
以下為與數(shù)據(jù)庫(kù)服務(wù)器建立連接代碼及解釋:
DataSource dataSource = new MysqlDataSource();//向上轉(zhuǎn)型
//數(shù)據(jù)庫(kù)來(lái)源
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
//賬戶
((MysqlDataSource)dataSource).setUser("root");
//密碼
((MysqlDataSource)dataSource).setPassword("你的密碼");
//與數(shù)據(jù)進(jìn)行連接
Connection connection = dataSource.getConnection();
在 dataSource 使用的方法中:
- setUrl 是表明MySQL數(shù)據(jù)庫(kù)的來(lái)源
- setUser 是表明MySQL數(shù)據(jù)庫(kù)的賬號(hào)(下載時(shí)的賬號(hào)默認(rèn)為root)
- setPassword 是MySQL數(shù)據(jù)庫(kù)密碼
除了URL中的數(shù)據(jù)庫(kù)不確定外,賬號(hào)、密碼就是你下載MySQL數(shù)據(jù)庫(kù)時(shí)你設(shè)置的MySQL賬號(hào)和密碼,相信大家都還記得。
4.3 構(gòu)造sql語(yǔ)句
靜態(tài)的構(gòu)造方法:
構(gòu)造sql語(yǔ)句,我們使用 String 類型的變量來(lái)初始化 sql 語(yǔ)句。初始化好的變量我們直接通過(guò)? prepareStatement 這個(gè)方法把該變量傳入數(shù)據(jù)庫(kù)中,這樣數(shù)據(jù)庫(kù)拿到的就是一條 sql 語(yǔ)句了。
//靜態(tài)構(gòu)造sql語(yǔ)句
String sql = "insert into student value(101,'張三')";//插入sql語(yǔ)句
通過(guò)上方代碼,大家乍一看。這不是在 Java 編譯器里面寫 SQL 語(yǔ)句嗎?沒(méi)錯(cuò),其實(shí) JDBC 編程就是通過(guò)在 Java 編譯器里面引入一些 SQL 語(yǔ)句來(lái)達(dá)到操作數(shù)據(jù)庫(kù)的效果。
動(dòng)態(tài)構(gòu)造方法:
當(dāng)然以上的寫法,是把 sql語(yǔ)句 固定死了,這樣在就不能與用戶達(dá)到交流。因此,我們可以通過(guò)鍵盤輸入來(lái)達(dá)到動(dòng)態(tài)輸入效果。
//動(dòng)態(tài)構(gòu)造sql語(yǔ)句
Scanner scanner = new Scanner(System.in);
String sql = "insert into student value(?,?)";
System.out.println("請(qǐng)輸入id:");
int id = scanner.nextInt();
System.out.println("請(qǐng)輸入name:");
String name = scanner.next();
statement.setInt(1,id);
statement.setString(2,name);
通過(guò)鍵盤輸入,我們需要將value里面的值替換為?號(hào),再通過(guò)對(duì)應(yīng)的set方法來(lái)進(jìn)行對(duì)應(yīng)值的輸入。在我的 student 表中
4.4 執(zhí)行sql語(yǔ)句
通過(guò) prepareStatement方法 把sql語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中,當(dāng)然我們得使用 Connection類型 的引用來(lái)調(diào)用 prepareStatement方法。
//通過(guò)prepareStatement方法把sql語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)
PreparedStatement statement = connection.prepareStatement(sql);
4.5 遍歷結(jié)果集
遍歷結(jié)果按照ResultSet類型下的executeQuery方法來(lái)獲取,在使用next()方法來(lái)達(dá)到遍歷。在上方 3.3ResultSet類 中講解到了,因此可以寫出以下代碼:
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = "+id+" name = "+name);
}
4.6?釋放資源?
釋放按照先進(jìn)后出的順序進(jìn)行釋放,什么意思呢?先執(zhí)行的方法,我們先進(jìn)行釋放,后執(zhí)行的方法我們后釋放,按照棧的順序先進(jìn)后出。
//通過(guò)close方法釋放必要的資源
statement2.close();
statement1.close();
connection.close();
為啥要釋放資源,在 Java 連接 MySQL數(shù)據(jù)庫(kù) 并且傳 SQL語(yǔ)句 時(shí)占用著內(nèi)存中的空間。如果我們不使用 close方法 進(jìn)行關(guān)閉連接的狀態(tài)將一直保持著占用資源的狀態(tài),因此我們得釋放這些連接。
4.7 最終效果展示
JDBC的 6 個(gè)步驟展示:
public static void main(String[] args) throws SQLException {
//1.創(chuàng)建并初始化數(shù)據(jù)源
DataSource dataSource = new MysqlDataSource();
//2.與數(shù)據(jù)庫(kù)服務(wù)器建立連接
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root(填你自己的賬號(hào))");
((MysqlDataSource)dataSource).setPassword("我的密碼(填你自己的密碼)");
Connection connection = dataSource.getConnection();
//3.構(gòu)造sql語(yǔ)句
String sql1 = "insert into student values(101,'張三'),(102,'李四'),(103,'王五')";
String sql2 = "select * from student;";
//4.執(zhí)行sql語(yǔ)句
PreparedStatement statement1 = connection.prepareStatement(sql1);
PreparedStatement statement2 = connection.prepareStatement(sql2);
int ret = statement1.executeUpdate();
System.out.println("修改了"+ret+"條信息");//顯示修改信息
//5.遍歷結(jié)果集
ResultSet resultSet = statement2.executeQuery();
System.out.println("Student表信息:");
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = "+id+" name = "+name);
}
//6.釋放資源
statement2.close();
statement1.close();
connection.close();
}
Java編譯器輸出:
MySQL窗口顯示:
上述代碼中的 executeUpdate方法 具體實(shí)現(xiàn)效果如下:
- executeUpdate的返回值是一個(gè)整數(shù),指受影響的行數(shù)(即更新計(jì)數(shù))
- 對(duì)于create table或drop table等不操作行的語(yǔ)句,executeUpdate的返回值為零
?????作者:程序猿愛(ài)打拳,Java領(lǐng)域新星創(chuàng)作者,阿里云社區(qū)博客專家。
???文章收錄于:MySQL數(shù)據(jù)庫(kù)
???JavaSE的學(xué)習(xí):JavaSE
???數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí):?數(shù)據(jù)結(jié)構(gòu)與算法文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-457844.html
本片博文到這里就結(jié)束了,如有收獲還請(qǐng)給博主點(diǎn)個(gè)小小的關(guān)注,感謝您的支持~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-457844.html
到了這里,關(guān)于MySQL數(shù)據(jù)庫(kù),JDBC連接數(shù)據(jù)庫(kù)操作流程詳細(xì)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!