Java數據庫連接—JDBC(JDBC詳解、JDBC控制事務、C3P0連接池、Druid連接池、Spring JDBC-JDBC Template)

Java數據庫連接—JDBC(JDBC詳解、JDBC控制事務、C3P0連接池、Druid連接池、Spring JDBC-JDBC Template)

<<<<<CSDN排版和顯示圖片有少許問題,所以看美觀完整的進Java數據庫連接—JDBC(JDBC詳解、JDBC控制事務、C3P0連接池、Druid連接池、Spring JDBC-JDBC Template)>>>>>

1、JDBC

①JDBC概念和本質

JDBC(Java DataBase Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。
JDBC本質其實是官方(Sun公司)定義的一套操作所有關係型數據庫的規則,即接口。各個數據庫廠商去實現這套藉口,提供數據庫驅動jar包,我們可以使用這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類。

②下載地址

方式一:進入 https://dev.mysql.com/downloads/connector/j/ 後選擇 Platform Independent ,點擊下載即可;或者進https://mvnrepository.com/ 選擇對應的版本下載也可以
方式二:進入MySQL官網 >>> 點擊DOWNLOADS >>> 點擊Community >>> 點擊MySQL Connectors >>> 點擊Connector/J >>> 選擇 Platform Independent >>> 下載即可

MySQL Connector/J 8.0以前的版本的類名是com.mysql.jdbc.Driver
MySQL Connector/J 8.0開始類名更改爲com.mysql.cj.jdbc.Driver

③初步測試使用(下面該例子只爲給初次使用JDBC的入門一下)

步驟:
1.導入驅動jar包
在Intellij IDEA新建一個Project後再新建一個Module,在該Module下新建一個lib目錄,然後將 “mysql-connector-java-5.1.37-bin.jar” 複製進去,然後右鍵lib目錄右鍵 Add as Library
2.註冊驅動
新建一個Package,再新建一個Class,在main函數中寫入如下代碼:
Class.forName(“com.mysql.jdbc.Driver”);
以上代碼爲註冊驅動,注意需要處理異常
3.獲取數據庫連接對象Connection
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/hh”,“root”,“root”);
以上代碼中,hh 爲數據庫名字,第一個root爲MySQL登錄賬號,第二個root爲MySQL登錄賬號的密碼
4.定義sql
String sql = “UPDATE employees SET achievement = 100”;
以上代碼中,我將我電腦的的hh數據庫中的employees的achievement字段都修改爲 100
5.獲取執行SQL語句的對象Statement
Statement statement = connection.createStatement();
6.執行SQL,接受返回結果
int i = statement.executeUpdate(sql);
7.處理結果
System.out.println(i);
8.釋放資源
statement.close();
connection.close();
9.結果
數據庫的數據修改成功
完整代碼如下圖所示:

④JDBC各個類詳解

DriverManager—JDBC驅動程序管理對象
功能
1、註冊驅動:告訴程序該使用哪一個數據庫驅動jar
static void registerDriver(Driver driver) 向 DriverManager 註冊給定驅動程序
Class.forName(“com.mysql.jdbc.Driver”);
在com.mysql.jdbc.Driver源碼中可以看到如下一段靜態代碼塊:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException(“Can’t register driver!”);
}
}
注意:MySQL5之後的驅動jar包中META-INF/services/java.sql.Driver中的代碼會自動幫你註冊驅動,從而你可以省略Class.forName(“com.mysql.jdbc.Driver”)
2、獲取數據庫連接
static Connection getConnection(String url, String user, String password) 試圖建立到給定數據庫 URL 的連接
url:數據庫url(語法:jdbc:mysql://IP地址或者域名:端口號/數據庫名稱)如果連接的是本地MySQL服務器且端口爲3306,則url可以簡寫jdbc:mysql:///數據庫名
Connection—數據庫連接對象
功能
1、獲取 執行SQL 的對象
Statement createStatement() 創建一個 Statement 對象來將 SQL 語句發送到數據庫
PreparedStatement prepareStatement(String sql) 創建一個 PreparedStatement 對象來將參數化的 SQL 語句發送到數據庫
2、管理事務
開啓事務: void setAutoCommit(boolean autoCommit) autoCommit - 爲 true 表示啓用自動提交模式;爲 false 表示禁用自動提交模式
提交事務: void commit() 使所有上一次提交/回滾後進行的更改成爲持久更改,並釋放此 Connection 對象當前持有的所有數據庫鎖
回滾事務: void rollback() 取消在當前事務中進行的所有更改,並釋放此 Connection 對象當前持有的所有數據庫鎖
Statement—執行靜態 SQL 語句並返回它所生成結果的對象
執行SQL方法
boolean execute(String sql) 執行給定的 SQL 語句,該語句可能返回多個結果,如果第一個結果爲 ResultSet 對象,則返回 true;如果其爲更新計數或者不存在任何結果,則返回 false
int executeUpdate(String sql) 執行的SQL語句可能爲DML語句(INSERT、UPDATE 或 DELETE),還有不返回任何內容的 SQL 語句(DDL 語句)
(1) 對於SQL數據操作語言 (DML) 語句,返回行計數 (2) 對於DDL之類的語句,返回0(通過返回值可以判斷DML語句是否執行成功,返回值>0則成功)
ResultSet executeQuery(String sql) 執行給定的 SQL 語句,通常爲靜態DQL(SELECT)語句,該語句返回單個 ResultSet 對象

將“③初步測試使用”的例子改進一下,代碼如下:

項目工程圖和執行結果圖如下:

ResultSet—結果集對象,封裝查詢的結果
boolean next() :將光標從當前位置向接下來的方向移一行 ;如果新的當前行有效,則返回 true;如果不存在下一行,則返回 false。配合while循環來獲取數據
getXxx(int columnIndex):獲取每列結果(Xxx代表每列的數據類型);該方法接收的參數爲int類型,代表要獲取列的編號,列的標號從左往右是從1開始計數
getXxx(String columnLabel):獲取每列結果(Xxx代表每列的數據類型);該方法接收的參數爲String類型,表示數據庫中列的名稱
使用以上兩種getXxx方式int參數或String參數都可以達到同樣的效果
例如下圖查詢例子:

查詢結果如下圖:

PreparedStatement—預編譯的 SQL 語句的對象
SQL注入:通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令
例如:利用的就是AND和OR的運算規則,從而造成後臺腳本邏輯性錯誤
那麼我使用 ‘xxx’ or ‘a’=‘a’ 來做用戶名密碼的話,那麼查詢就變成:
SELECT * FROM adminbate WHERE user=‘xxx’ AND password=‘xxx’ OR ‘a’=‘a’ >>> WHERE條件就變成了true
上述SQL注入問題可以通過PreparedStatement對象來解決,該對象使用預編譯的SQL,即參數使用 ? 作爲佔位符 而不是靠拼接
獲取SQL語句的對象和 上面寫的例子中不同,通過
Connection的方法PreparedStatement prepareStatement(String sql) 創建一個 PreparedStatement 對象來將參數化的 SQL 語句發送到數據庫
void setXxx(int parameterIndex, Xxx x) 將指定參數設置爲給定輸入流。Xxx代表的是類型;其中parameterIndex表示?的位置,從1開始計數;x代表的是?參數值
reparedStatement可以在傳入sql後,執行語句前,給參數賦值,避免了因普通的拼接sql字符串語句所帶來的安全問題,而且準備sql和執行sql是在兩個語句裏面完成的,也提高了語句執行的效率 比如單引號會給你加一個轉義,加個斜槓。上面的sql語句在數據庫裏執行就是這樣
SELECT * FROM adminbate WHERE user=‘xxx’ AND password=’‘xxx’ OR ‘a’=‘a’ ’
開發都是使用 PreparedStatement 來執行增刪改查操作,因爲 1、安全 2、效率高

⑤JDBC控制事務

數據庫事務(簡稱:事務)是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成;多個執行步驟在一起,要麼同時成功,要麼同時失敗
Connection對象管理事務操作
1、開始事務 void setAutoCommit(boolean autoCommit) 將此連接的自動提交模式設置爲給定狀態 ,autoCommit - 爲 true 表示啓用自動提交模式;爲 false 表示禁用自動提交模式(在執行SQL語句之前開始事務)
2、提交事務 void commit() 使所有上一次提交/回滾後進行的更改成爲持久更改,並釋放此 Connection 對象當前持有的所有數據庫鎖 (當所有事務中的SQL執行完就提交事務)
3、回滾事務 void rollback() 取消在當前事務中進行的所有更改,並釋放此 Connection 對象當前持有的所有數據庫鎖 (可以在catch中回滾事務)
JDBC事務案例(核心代碼):

捕獲異常的時候,儘量捕獲範圍比較大的,比如上圖例子中的Exception,因爲在發生任何異常情況下都得事務回滾

⑥數據庫連接池

數據庫連接池
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的數據庫連接來避免因爲沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
javax.sql接口 DataSource(注意是javax包下的;DataSource 接口由驅動程序供應商實現)
獲取連接
Connection getConnection() 嘗試建立與此 DataSource 對象所表示的數據源的連接。返回:到數據源的連接
歸還連接
如果連接對象Connection是從連接池中獲取的,那麼調用Connection.close()方法,則不會關閉連接,而是歸還到連接池中

C3P0:

C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。
下載:
1、進入 https://www.mchange.com/projects/c3p0/ C3P0官網(或者直接進 https://mvnrepository.com/ maven倉庫選擇對應的版本下載也可以)
2、點擊 “ c3p0’s site on SourceForge ”
3、選擇版本後點擊 “Download”
使用方式:
1、導入 c3p0-0.9.5.2-sources.jar 和 mchange-commons-java-0.2.11-sources.jar 兩個jar包(當然記得要導入mysql-connector-java-x.x.xx-bin.jar)
2、定義配置文件名稱 c3p0.properties 或者 c3p0-config.xml ,路徑默認在項目類路徑下,直接將文件放在src目錄下即可,其中頁面有個 “via an XML configuration file”,然後可以根據官網提供的模板複製配置。
c3p0-config.xml 簡單配置案例:

3、創建核心對象,數據庫連接對象ComboPooledDateSource(com.mchange.v2.c3p0.ComboPooledDataSource,可以在源碼中看到一步一步繼承或者實現,但是最終是實現 javax.sql.DataSource)
4、獲取連接:getConnection

下面該圖只是簡單示例創建C3P0的方法:

Druid(德魯伊):

阿里巴巴開源平臺上一個數據庫連接池實現結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池(據說是全球最好的連接池技術之一)。
下載:
可以進這個網址 http://repo1.maven.org/maven2/com/alibaba/druid/ 選擇對應的版本下下載或者進 https://mvnrepository.com/ 選擇對應的版本下載
使用方式:
1、導入druid-1.1.9.jar (當然記得要導入mysql-connector-java-x.x.xx-bin.jar)
2、定義配置文件,properties文件的形式,可以命名爲任意名字,同時也可以放在任意目錄下,一般叫druid.properties
配置參數如下圖所示:

3、加載配置文件
4、獲取數據庫連接池對象:通過工廠類 DruidDataSourceFactory
5、獲取連接:getConnection
創建Druid連接池小案例:

Spring JDBC :JDBC Template

Spring JDBC 是spring 官方提供的一個持久層框架,對jdbc進行了抽象和封裝,消除了重複冗餘的jdbc重複性的代碼,使操作數據庫變的更簡單。
下載
進入maven倉庫 https://mvnrepository.com/ 後,下載 1、spring-tx-5.1.5.RELEASE 2、spring-jdbc-5.1.5.RELEASE.jar 3、spring-core-5.1.5.RELEASE.jar 4、spring-beans-5.1.5.RELEASE.jar 5、commons-logging-1.2.jar (當然你也可以下載其他版本號的這些jar包)
使用方式:
1、導入jar包(除了上面五個jar包外還有數據庫連接池jar包和數據庫連接的jar包)
2、創建JdbcTemplate對象,依賴於數據源DataSource
new JdbcTemplate(dataSource)
3、調用JdbcTemplate的方法來完成CRUD操作
update():執行DML語句或者DDL語句;增刪改語句
queryForMap():查詢結果後將結果集封裝爲map集合(字段列名爲key,值爲value;並且該方法返回的結果集長度只能爲1)
queryForList():查詢結果後將結果集封裝爲list集合(將每一條記錄封裝爲map集合,再將map集合封裝到list集合中,可以查詢多條)
query():查詢結果,將結果封裝爲JavaBean對象(query參數 RowMapper,一般使用BeanPropertyRowMapper實現類。可以完成數據到JavaBean的自動封裝,new BeanPropertyRowMapper<類型>(類型.class))
queryForObject():查詢結果,將結果封裝爲對象(一般用於聚合函數的查詢)

利用JdbcTemplate和Druid連接池執行更改數據庫數據的例子(增刪改操作和此例子寫法相似):

利用JdbcTemplate和Druid連接池執行查詢數據庫數據的例子(queryForMap()方法):

利用JdbcTemplate和Druid連接池執行查詢數據庫數據的例子(queryForList()方法):

利用JdbcTemplate和Druid連接池執行查詢數據庫數據的例子(queryForObject()方法):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章