本篇內(nèi)容主要講解“MySQL數(shù)據(jù)庫JDBC編程知識點有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“MySQL數(shù)據(jù)庫JDBC編程知識點有哪些”吧!
創(chuàng)新互聯(lián)響應(yīng)式網(wǎng)站特點就是不管在電腦、平板還是手機上,H5網(wǎng)站設(shè)計都會根據(jù)屏幕尺寸自動調(diào)節(jié)大小、圖片分辨率,并且融入一定的動畫特效,讓網(wǎng)站看起來非常的美觀大方。從網(wǎng)站需求對接到網(wǎng)站制作設(shè)計、從代碼編寫到項目上線運維,技術(shù)人員全程跟蹤,快速響應(yīng)
MySQL的jdbc驅(qū)動包我們可以去官網(wǎng)下載,我們也可以maven中央倉庫下載,這個maven中央倉庫是什么呢?你可以理解為我們手機中的“應(yīng)用商店”軟件,它的作用和應(yīng)用商店的作用是差不多的,只不過手機應(yīng)用商店里面是手機軟件,而maven中央倉庫里面有許多的API以及依賴包。
現(xiàn)在MySQL已經(jīng)被Oracle收購了,Oracle的“吃相”有點難看,從官網(wǎng)找可以找到,但是我感覺maven中央倉庫更好找一點,所以我們到maven中央倉庫下載jdbc驅(qū)動包。
第一步,點進網(wǎng)址進入maven中央倉庫。
第二步,搜索MySQL,選擇如下圖那一個。
第三步,點擊進入,找到對應(yīng)大版本的jdbc驅(qū)動包,如果你的MySQL是5版本那驅(qū)動包也選擇5版本的,當然如果你的MySQL是8版本,那你的驅(qū)動包也選擇8版本。
我的MySQL是5版本所以我選擇大版本為5的驅(qū)動包。
第四步,點擊進去,按下圖操作,下載驅(qū)動包。
下載完成我們的驅(qū)動包就準備好了。
使用編譯器創(chuàng)建一個項目,項目創(chuàng)建好后,按照下面的步驟操作:
第一步,創(chuàng)建一個目錄,名字隨便起,不妨叫做lib
目錄。
第二步,將下載好的驅(qū)動包拷貝到該目錄。
第三步,設(shè)置選項,右鍵剛才創(chuàng)建并已經(jīng)將驅(qū)動包拷貝的目錄,找到As a Lib…
這樣我們的驅(qū)動包就導(dǎo)進我們的項目中了,然后我們就能來寫jdbc代碼了。
第一步,創(chuàng)建DataSource
對象,來描述這個數(shù)據(jù)庫在哪里。
DataSource dataSource = new MysqlDataSource();
其中DataSource
為java.sql
里面的一個jdbc接口,MysqlDataSource
是來源與我們所下載驅(qū)動包中的一個實現(xiàn)DataSource
接口的類。
第二步,設(shè)置數(shù)據(jù)庫的“位置”(URL),登錄數(shù)據(jù)庫的賬戶名和密碼。
//設(shè)置數(shù)據(jù)庫所在地址 ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbctest/characterEncoding=utf8&useSSL=false"); //設(shè)置登錄數(shù)據(jù)庫的賬戶名 ((MysqlDataSource)dataSource).setUser("root"); //設(shè)置登錄數(shù)據(jù)庫的密碼 ((MysqlDataSource)dataSource).setPassword("123456");
jdbc:mysql://127.0.0.1:3306/jdbctest?characterEncoding=utf8&useSSL=false
就是一個URL,也叫唯一資源定位符。jdbc:mysql
表示該url
是用于jdbc mysql的URL,因為數(shù)據(jù)庫有很多,不止jdbc一種,所以需要細分。
具體含義自主對照:URL類型聲明://數(shù)據(jù)庫的地址/數(shù)據(jù)庫名?字符集編碼&是否加密
。
第三步,和服務(wù)器建立連接,創(chuàng)建好數(shù)據(jù)源DataSource
對象后,調(diào)用該對象的getConnection()
方法,獲取java.sql.Connection
對象,這樣就與數(shù)據(jù)庫建立起來連接了。
Connection connection = dataSource.getConnection();
第四步,構(gòu)造sql
語句字符串,并將該語句包裝成PreparedStatement
對象,即調(diào)用Connection
對象的prepareStatement
方法,參數(shù)是sql字符串,會返回一個PreparedStatement
對象,然后我們再調(diào)用PreparedStatement
對象中的executeUpdate
方法或executeQuery
方法執(zhí)行sql
語句。
我們先以插入操作為例。
//操作數(shù)據(jù)庫 關(guān)鍵在于構(gòu)造sql語句 //jdbc 構(gòu)造的sql語句不需要帶上; String sql = "insert into student values(1, '張三')"; //將sql字符串包裝成一個語句對象,表示待執(zhí)行的sql的對象 PreparedStatement statement = connection.prepareStatement(sql); //執(zhí)行sql //如果待執(zhí)行的sql語句操作是insert, update, delete,則使用executeUpdate方法執(zhí)行,返回值為影響數(shù)據(jù)的行數(shù) //如果待執(zhí)行的sql語句操作是select,則使用executeQuery方法執(zhí)行 int ret = statement.executeUpdate();
其中,如果待執(zhí)行的sql語句操作是insert, update, delete,則使用executeUpdate方法執(zhí)行,返回值為影響數(shù)據(jù)的行數(shù),如果待執(zhí)行的sql語句操作是select,則使用executeQuery方法執(zhí)行,返回值是一個ResultSet
結(jié)果表對象。
第五步,釋放資源,我們執(zhí)行完畢sql語句后需要及時地將資源釋放,在JDBC編程中,最常見需要釋放的類或接口有三個,分別是Connection
,PreparedStatement
,ResultSet
,其中前面兩個在jdbc插入操作中已經(jīng)使用過了,而最后一個,即ResultSet
,它是在執(zhí)行查詢語句需要用到的,調(diào)用executeQuery
方法執(zhí)行查詢語句之后,會返回一個“臨時表”,該“臨時表”上儲存了查詢的結(jié)果,我們可以通過遍歷該結(jié)果表來獲取查詢數(shù)據(jù)庫的結(jié)果。
//此時sql語句已經(jīng)執(zhí)行完畢了,需要釋放資源statement.close();connection.close();
使用jdbc編程進行插入操作全部代碼:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.Scanner;public class TestJdbc { public static void main(String[] args) throws SQLException { DataSource dataSource = new MysqlDataSource(); //設(shè)置數(shù)據(jù)庫所在地址 ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbctest?characterEncoding=utf8&useSSL=false"); //設(shè)置登錄數(shù)據(jù)庫的賬戶名 ((MysqlDataSource)dataSource).setUser("root"); //設(shè)置登錄數(shù)據(jù)庫的密碼 ((MysqlDataSource)dataSource).setPassword("123456"); //建立連接 Connection connection = dataSource.getConnection(); //操作數(shù)據(jù)庫 關(guān)鍵在于構(gòu)造sql語句 //jdbc 構(gòu)造的sql語句不需要帶上; String sql = "insert into student values(1, '張三')"; //將sql字符串包裝成一個語句對象,表示待執(zhí)行的sql的對象 PreparedStatement statement = connection.prepareStatement(sql); //執(zhí)行sql //如果待執(zhí)行的sql語句操作是insert, update, delete,則使用executeUpdate方法執(zhí)行,返回值為影響數(shù)據(jù)的行數(shù) //如果待執(zhí)行的sql語句操作是select,則使用executeQuery方法執(zhí)行 int ret = statement.executeUpdate(); //此時sql語句已經(jīng)執(zhí)行完畢了,需要釋放資源 statement.close(); connection.close(); }}
運行結(jié)果,我們通過查詢數(shù)據(jù)庫的表的結(jié)果來進行觀察:
mysql> create database jdbctest;Query OK, 1 row affected (0.01 sec)mysql> use jdbctest;Database changed mysql> create table student(id int, name varchar(20));Query OK, 0 rows affected (0.02 sec)mysql> show tables;+--------------------+| Tables_in_jdbctest |+--------------------+| student |+--------------------+1 row in set (0.00 sec)-- 執(zhí)行jdbc代碼后查詢mysql> select * from student;+------+--------+| id | name |+------+--------+| 1 | 張三 |+------+--------+1 row in set (0.00 sec)
程序運行結(jié)果,表示1行受到了影響。
我們發(fā)現(xiàn)我們的sql語句是完完全全寫死的,這一點不好,我們可以使用輸入的操作讓用戶輸入信息進行插入,那就需要使用到Scanner
類了。
我們得到用戶輸入的信息后,我們需要對信息進行整合,最容易想到的方式就是字符串拼接,但是這么做有如下的缺點,一是容易寫錯,特別是單雙引號比較多的情況下,二是不安全,黑客可以使用sql注入的方式來修改數(shù)據(jù)庫。
所以更好的方法就是把sql字符串中待輸入的信息使用?
來代替或者叫做占位,然后通過PreparedStatement
中的setXXX
系列方法來逐個設(shè)置每個?
的內(nèi)容是什么。
這個系列的方法,第一個參數(shù)表示sql待執(zhí)行對象中第多少個?
,第二個參數(shù)表示將這個?
設(shè)置的內(nèi)容。比如:
//操作數(shù)據(jù)庫 關(guān)鍵在于構(gòu)造sql語句 //jdbc 構(gòu)造的sql語句不需要帶上; String sql = "insert into student values(?, ?)"; //將sql字符串包裝成一個語句對象,表示待執(zhí)行的sql的對象 PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1, id); statement.setString(2, name);
完整代碼:jdbc插入操作源代碼
運行結(jié)果:
數(shù)據(jù)庫查詢結(jié)果:
mysql> select * from student;+------+--------+| id | name |+------+--------+| 1 | 張三 || 2 | 李四 |+------+--------+2 rows in set (0.00 sec)
在jdbc編程中,刪除操作和更新操作,它的步驟與插入操作是一模一樣的,只不過就是構(gòu)造的sql
語句不一樣,其他都一樣。
刪除操作關(guān)鍵代碼:
//用戶輸入 System.out.println("請輸入需要刪除的學(xué)號:"); int id = sc.nextInt(); //操作數(shù)據(jù)庫 關(guān)鍵在于構(gòu)造sql語句 //jdbc 構(gòu)造的sql語句不需要帶上; String sql = "delete from student where id = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1, id); System.out.println("statement" + statement);
程序運行結(jié)果:
數(shù)據(jù)庫查詢結(jié)果:
mysql> select * from student;+------+--------+| id | name |+------+--------+| 1 | 張三 |+------+--------+1 row in set (0.00 sec)
更新操作關(guān)鍵代碼:
//用戶輸入 需要修改的id 與修改后的姓名 System.out.println("請輸入需要修改的學(xué)號:"); int id = sc.nextInt(); sc.nextLine(); System.out.println("請輸入修改后的姓名:"); String afterName = sc.nextLine(); //操作數(shù)據(jù)庫 關(guān)鍵在于構(gòu)造sql語句 //jdbc 構(gòu)造的sql語句不需要帶上; String sql = "update student set name = ? where id = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, afterName); statement.setInt(2, id); System.out.println("statement" + statement);
jdbc更新操作完整代碼:源代碼地址
程序運行結(jié)果:
數(shù)據(jù)庫查詢結(jié)果:
mysql> select * from student;+------+--------+| id | name |+------+--------+| 1 | 王五 |+------+--------+1 row in set (0.00 sec)
jdbc的查詢操作與插入刪除更新操作有一點點不同,執(zhí)行查詢sql語句的時候是調(diào)用executeQuery
方法來執(zhí)行語句的,并且會帶回查詢的結(jié)果,我們可以通過類似與迭代器的操作來獲取查詢的結(jié)果,這個結(jié)果集使用完后需要將它釋放。
關(guān)鍵代碼:
//操作數(shù)據(jù)庫 關(guān)鍵在于構(gòu)造sql語句 //jdbc 構(gòu)造的sql語句不需要帶上; String sql = "select * from student"; PreparedStatement statement = connection.prepareStatement(sql); //執(zhí)行sql 查詢操作返回的不是int 而是一個臨時表 使用ResultSet對象表示這個臨時表 ResultSet ret = statement.executeQuery(); //便利結(jié)果集合 //預(yù)期結(jié)果格式// +------+--------+// | id | name |// +------+--------+// | 1 | 王五 |// +------+--------+ while (ret.next()) { int id = ret.getInt("id"); String name = ret.getString("name"); System.out.println("id:" + id + ", name:" + name); } //關(guān)閉資源 ret.close(); statement.close(); connection.close();
程序運行結(jié)果:
到此,相信大家對“MySQL數(shù)據(jù)庫JDBC編程知識點有哪些”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!