您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何進行JDBC的分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
如果你想實現代碼操作數據庫,那么以下條件是你實現它的前提
編程語言:
例如 Java、C++、Python 等等,這些語言都能夠實現操作數據庫
某個數據庫的操作:
例如我在前面章節就介紹了關于 MySQL 的操作,實現其它數據庫如 Oracle、SQL Server 等等也要學會對應數據庫的一些操作
安裝數據庫驅動包:
不同的數據庫對應不同的編程語言提供了不同的數據庫驅動包,這些驅動包內實現了操作對應數據庫的 API
由于不同數據庫的廠商實現數據庫的 API 其實是不太一樣的,因此很多語言就把這些數據庫的 API 進行再一次的封裝,封裝出了一套統一的 API。這樣就可以通過一套代碼來操作多個不同的數據庫了
在 Java 中,這樣的封裝就是由 Java 標準庫來完成的,封裝出了一套統一的數據庫 API 稱為 JDBC
拓展:
Java 本身是跨平臺語言,雖然不同操作系統提供了不同的 API,但是 Java 本身也把這些 API 封裝了起來,在標準庫中提供了統一的接口,因此 Java 就可以一次編譯,到處運行
JDBC 介紹:
JDBC,即 Java Database Connectivity
,是指 Java 數據庫連接。是一種用于執行 SQL 語句的 Java API
,它是 Java 中的數據庫連接規范。
這個 API 由 java.sql
和 javax.sql
包中的一些類和接口組成,它為 Java 開發人員操作數據庫提供了一個標準的 API,可以為多種關系數據庫提供統一訪問
注意:
JDBC API 是 Java 標準庫自帶的,可以直接用,但是 MySQL 的 JDBC 驅動不是系統自帶的,因此需要額外進行下載安裝
MySQL 的 JDBC 驅動其實就是對 JDBC API 里面一些類和接口的具體實現
由于 MySQL 的 JDBC 驅動不是系統自帶的,因此需要額外進行下載安裝
各大數據庫的官網就有對應數據庫的 JDBC 驅動,但這里我推薦使用一些中央倉庫來進行下載,例如 mvnrepository
驅動包下載步驟:
進入 mvnrepository 網站,在搜索欄搜索 MySQL,就可以查詢到以下結果
選擇第一個 MySQL Connector/J,就可以跳轉到下載版本選擇的頁面
選擇好自己對應的數據庫版本的驅動(大版本一定要對應,小版本區別不大可以隨意選),由于我自己是 5.x 系列的MySQL,因此,我選擇大版號是5的就行。選擇后就跳到了最終下載的頁面
點擊 jar 就開始下載了(這個 jar 包就是將這個驅動包中的一些 .class 文件以壓縮包的形式進行打包了)
下載完成后,這個驅動包就已經下載到你本地了,只再將它引入到你的項目就可以是用了
驅動包添加到項目步驟(以下介紹一種方法):
首先用自己的編譯器創建一個項目(我個人用的 IDEA,但是其它編譯器方式也一樣)
在你的項目里面新建一個目錄,目錄名隨意(我個人起的是 lib)
將下載的驅動包添加到這個目錄中,直接 CV 就行,添加成功后就會出現
讓我們新建的這個添加了驅動包的目錄成為一個庫(IDEA 中右鍵該目錄,選擇 add as Library… 就可以)
將這個庫加好之后,就可以使用驅動包中的類和方法了,此時就可以進行數據庫編程了
創建一個數據庫源:
DataSource dataSource=new MysqlDataSource(); // DataSource 是來自于 Java 標準庫的一個接口,它用來表示“數據庫在哪” // MysqlDataSource 是來自于 MySQL 的驅動包,它是實現了 DataSource 接口的類
數據庫就是一個服務器程序,可以通過 DataSource
來描述服務器的 地址、端口、用戶名、密碼、要訪問的數據庫名等
把數據庫的位置信息,設置到 DataSource
中
// 1)通過一個 URL 來表示連接的數據庫、數據庫的 ip、端口、數據庫名、編碼方式、是否加密 ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&setSSL=false"); // 2)設置登錄數據庫的用戶名 ((MysqlDataSource)dataSource).setUser("root"); // 3)設置登錄數據庫的密碼 ((MysqlDataSource)dataSource).setPassword("1234");
由于 setURL
、setUser
、setPassword
都是 MysqlDataSource
實現的,所以使用時需要向下轉型
上述 URL 是一種固定的寫法,例如:jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&setSSL=false
jdbc 表示使用 JDBC 訪問數據庫
mysql 表示訪問的數據庫是 MySQL
172.0.0.1 是 IP 地址,IP 地址是用來區分是哪個主機,172.0.0.1 這個 IP 地址表示當前使用的主機自身,因為我的 MySQL 服務器也裝在自己電腦上,自行修改
3306 是端口號,這是安裝數據庫服務器時手動設置的,一般默認是3306,它是用來區分主機上的某個程序
test 是要訪問的數據庫名,這是我數據庫里面的,自行修改
characterEncoding=utf8
是用來指定編碼方式的,此處是使用 utf8,需要和使用的數據庫便方式對應,自行修改
useSSL=false
是用來表示是否加密的,此處表示不加密,自行修改
連接數據庫,進行真正的網絡通信:
Connection connection=dataSource.getConnection();
Connection
是 Java 標準庫里的,雖然 MySQL 驅動里面也有。它是用來進行和數據庫服務器進行網絡連接的
getConnection 用于獲得試圖建立到指定數據庫 URL 的連接,如果連接成功就返回一個 Connection
對象,如果失敗就拋出異常
由于 getConnection
可能會連接失敗(例如 IP 地址、端口等輸入錯誤),因此就需要在方法聲明時通過 throws 給上層調用者拋出異常或者使用 try-catch
去處理異常
通過字符串,構造一個要執行的 sql
// 例如要執行新增元素操作(表名為 student,有兩列 id 和 student Scanner scanner=new Scanner(System.in); System.out.print("請輸入 id:"); int id=scanner.nextInt(); System.out.print("請輸入 姓名:"); String name=scanner.next(); String sql="insert into student values(?,?)";
sql 就是構造的 SQL 語句,里面就是要執行的具體操作
sql 語句中可以不用加分號
表示通配符,可以通過它對 sql 語句里的內容進行動態替換,需要替換的內容用 ?代替,后續再使用 PreparedStatement 對象的一些方法將其再替換成具體要更改的值
例如:
void setInt(int paramenterIndex, int x)
:paramenterIndex 表示 sql 語句中要替換通配符的具體位置(從1開始),x 表示要替換掉具體值void setString(int parameterIndex, String x)
:paramenterIndex 表示 sql 語句中要替換通配符的具體位置(從1開始),x 表示要替換掉具體值
通過 prepareStatement(sql) 方法,將構造的字符串 sql 轉化成真正的數據庫底層的 SQL 語句
PreparedStatement statement=connection.prepareStatement(sql); // 通過 setInt 方法,將 SQL 語句中的第一處通配符進行具體值的替換 statement.setInt(1,id); // 通過 setString 方法,將 SQL 語句中的第二處通配符進行具體值的替換 statement.setString(2,name);
JDBC 中,使用 Connection 和數據庫建立了連接對象 connection
,那么 connection
就可以調用 prepareStatement(String sql) 方法對參數 sql 指定的 SQL 語句進行編譯預處理,生成該數據庫底層的內部命令,并將該命令封裝在 PreparedStatement 對象中
通過 PreparedStatement
對象的 executeQuery
或者 executeUpdate 方法來執行 SQL
如果是執行內容變更的操作(增加、修改、刪除),就使用 int executeUpdate() 方法
int ret=statement.executeUpdate(); // executeUpdate 的返回結果是執行該操作后影響的行數 // 可以通過打印返回值來顯示影響的行數 System.out.println("ret: "+ret);
如果要是要執行查詢操作,就使用 ResultSet executeQuery() 方法
ResultSet resultSet=statement.executeQuery(); // executeQuery 的返回結果是執行該操作后查詢到的類似于臨時表的結構,存放在 ResultSet 對象中 // 接下來我們可以對它進行遍歷,類似于迭代器的遍歷,方法如下 while(resultSet.next()){ // 假設有兩列 id 和 name int id=resultSet.getInt(id); String name=resultSet.getString(name); System.out.println("id="+id+", name="+name); }
SQL 查詢語句對數據庫的查詢操作將返回一個 ResultSet
對象,ResultSet
對象由按列(字段)組織的數據行構成
ResultSet 對象一次只能看到一行數據,使用 next() 方法,可以移到下一個數據行(類似于 i++)
可以使用 ResultSet
對象的 getXxx()
方法,去獲得字段。常用方法后面講將介紹
當我們執行完了我們的 SQL 語句后,如果不再使用某些對象,就需要把連接關閉,釋放掉對應的資源
// 如果有 ResultSet 對象不需要使用后,需要關閉這個連接 resultSet.close(); // Connection 不需要使用后,需要關閉這個連接 connection.close(); // PreparedStatement 不需要使用后,需要關閉這個連接 statement.close();
ResultSet
、Connection
、PreparedStatement
這些對象都對應著一些及機器的硬件資源,如果不使用的話就要及時還回去。就類似于借書,如果大家在圖書館只借書,不還書,那么圖書館的書籍資源就會一直減少
這些對象可以使用 close()
方法,來關閉和客戶端與服務器建立的連接,以此釋放占用的資源
通過上面五步,就可以進行基礎的 Java 的 JDBC 編程了,雖然方法不止這一種,但如果你還不會的話,掌握這個方法就行了。最后再總結下整個的模板,依據它,我們就可以用 Java 語言對 MySQL 數據庫進行各種操作
public static void test(){ // 1. 創建數據庫源,連接 Connection DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("1234"); Connection connection=dataSource.getConnection(); // 2. 構造一個 SQL 語句,為要進行的操作做準備 String sql=""; PreparedStatement statement=connection.prepareStatement(sql); // 3. 執行 SQL,并處理結果集 int ret=statement.executeUpdate(); // 4. 執行完成,釋放資源 statement.close(); connection.close(); }
上述 JDBC 編程步驟中已經將以下接口和類介紹了很多,所以可以互相補充漏洞
補充:
上述代碼也可以直接使用 MysqlDataSource
來創建一個數據源,這樣就可以不用使用向下轉型了。但是如果使用 DataSource 的話,那么代碼中其它代碼其實都是使用 DataSource
這個類型的,這是和具體數據庫類型無關的類,當你需要切換數據庫時,就不需要大幅度修改代碼
Connection
接口實現類由數據庫提供,獲取 Connection
對象通常有兩種方式:
方式一: 通過 DataSource(數據源)對象獲取
// 創建一個數據庫源 DataSource dataSource=new MysqlDataSource(); // 設置數據庫具體信息 ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("1234"); // 創建數據庫連接 Connection connection=dataSource.getConnection();
方式二: 通過 DriverManager
(驅動管理類)的靜態方法獲取
// 加載 JDBC 驅動程序 Class.forName("com.mysql.cj.jdbc.Driver"); // 創建數據庫連接 Connection connection=DriverManager.getConnection(url);
MySQL 數據庫驅動程序被封裝在 Driver
類中,該類的包名是 com.mysql.cj.jdbc
,該類不是 Java 運行環境類庫中的類
上述兩種方式的區別:
DriverManager
類來獲取的 Connection
連接,是無法重復利用的,每次使用完以后釋放資源時,通過 connection.close()
都是關閉物理連接
DataSource
提供連接池的支持。連接池在初始化時創建一定數量的數據庫連接,這些連接是可以重復利用的,每次使用完數據庫連接,通過 connection.close()
釋放資源,都是將 Connection
連接對象回收
PreparedStatement
是 JDBC API 提供的三種可以將 SQL 語句發送到數據庫的對象之一。這里對這三種做一個簡單介紹
Statement
: 用于執行不帶參數的簡單 SQL
PreparedStatement
:
用于執行帶或者不帶參數的 SQL 語句
SQL 語句會預編譯在數據庫系統
執行速度快于 Statement 對象
CallableStatement
: 用于執行數據庫存儲過程的調用
ResultSet
對象它被稱為結果集,它代表符合 SQL 語句條件的所有行,并且它通過一套 getXxx() 方法提供了對這些行中數據的訪問
ResultSet 里的數據是一行一行排列的,每當有多個字段,并且有一個記錄指針,指針所指的數據行叫做當前數據行,我們只能來操作當前的數據行。我們如果想要取得某一條記錄,就要使用 ResultSet
的 next()
方法,可以通過結合 while 循環來遍歷 ResultSet 里的所有記錄
常見 ResultSet 對象方法:
注意:
ResultSet 對象和數據庫連接對象 Connection 實現了緊密連接,一旦連接對象被關閉,ResultSet 對象中的數據就會立刻消失
在 student 表中新增學生 id 和 name:
public static void testInsert() throws SQLException { DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("1234"); Connection connection=dataSource.getConnection(); Scanner scanner=new Scanner(System.in); System.out.print("請輸入id:"); int id=scanner.nextInt(); System.out.print("請輸入姓名:"); String name=scanner.next(); String sql="insert into student values(?,?)"; PreparedStatement statement=connection.prepareStatement(sql); statement.setInt(1,id); statement.setString(2,name); int ret=statement.executeUpdate(); System.out.println("ret: "+ret); statement.close(); connection.close(); }
在表名為 student 的表中,刪除學生表中符合 id 條件的記錄:
public static void testDelete() throws SQLException { DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("1234"); Connection connection=dataSource.getConnection(); Scanner scanner=new Scanner(System.in); System.out.print("請輸入要刪除的 id:"); int id=scanner.nextInt(); String sql="delete from student where id=?"; PreparedStatement statement=connection.prepareStatement(sql); statement.setInt(1,id); int ret=statement.executeUpdate(); System.out.println("ret: "+ret); statement.close(); connection.close(); }
在表名為 student 的表中,將符合 id 條件的學生姓名進行修改:
public static void testUpdate() throws SQLException { DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("1234"); Connection connection=dataSource.getConnection(); Scanner scanner=new Scanner(System.in); System.out.print("情輸入你要更改的學生 id:"); int id=scanner.nextInt(); System.out.print("請輸入你要更改后的學生姓名:"); String name=scanner.next(); String sql="update student set name=? where id=?"; PreparedStatement statement=connection.prepareStatement(sql); statement.setString(1,name); statement.setInt(2,id); int ret=statement.executeUpdate(); System.out.println("ret: "+ret); statement.close(); connection.close(); }
查找表名為 student 的表中的所有數據:
public static void testSelect() throws SQLException { DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("1234"); Connection connection=dataSource.getConnection(); String sql="select * from student"; PreparedStatement statement=connection.prepareStatement(sql); ResultSet resultSet=statement.executeQuery(); while(resultSet.next()){ int id=resultSet.getInt("id"); String name=resultSet.getString("name"); System.out.println("id = "+id+", name = "+name); } resultSet.close(); statement.close(); connection.close(); }
關于如何進行JDBC的分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。