Java数据库连接协议JDBC学习
什么是JDBC?
Java的官方文檔是如下描述的
The JDBC API is the industry standard for database-independent connectivity between the Java programming language and a wide range of databases. The JDBC API provides a call-level API for SQL-based database access. JDBC technology allows you to use the Java programming language to exploit "Write Once, Run Anywhere" capabilities for applications that require access to enterprise data.
JDBC API是獨立的數據庫連接工業標準協議,這個數據庫連接指的是Java編程語言和各種各樣數據庫的連接。JDBC API提供了通過SQL語言獲取數據的一套可調用接口API。JDBC技術允許開發者在開發企業數據獲取的應用中,使用JAVA語言來實現“一次寫入,多地運行”的能力。
就我的理解而言,JDBC是Java用來實現各種各樣數據庫連接的一套標準化接口協議。JDBC API定義了如何獲取/修改數據庫中的數據。由于不同的數據庫操作數據的底層協議不同,因此不同的數據庫廠商會提供對應的數據庫驅動,比如mysql有提供給Java的驅動mysql-connection-java-xxx.jar, oracle有提供給Java的驅動ojdbcxx.jar,sqlserver有提供給Java的驅動sqljdbcxx.jar等等。當然,這些數據庫廠商也有提供給其他編程語言的數據庫連接驅動,比如mysql提供給c++的驅動mysql-connector-c++-8.0.13-macos10.14-x86-64bit.dmg等等。而這些驅動會實現JDBC API,將其轉化成對應數據庫協議,從而實現了對數據的操作。
JDBC整體架構
JDBC API包含兩個主要的接口集合: 第一個就是為應用寫數據者提供的JDBC API, 第二個就是為驅動寫數據提供的更底層的JDBC驅動API. 應用可以通過JDBC API獲取數據,通過基于JAVA JDBC技術實現的驅動,如下圖所示
左邊這條線路表示驅動會把JDBC的接口調用轉換成關系型數據庫所使用的網絡協議,允許一個來自客戶端機器的數據調用直接傳遞給對應的關系型數據庫服務器,同時提供內部網的解決方案。
右邊這條線路則表示驅動會將JDBC的調用轉換成中間件供應商的協議,中間件服務器再將中間件的協議轉換成關系型數據庫的協議。中間件提供了對很多數據庫的連接。
JDBC API
1.Driver接口
在操作數據庫中的數據之前,先要加載對應的數據庫驅動,如加載mysql對應的數據庫驅動示例代碼如下:Class.forName("com.mysql.jdbc.Driver");
2.Connection接口
加載完驅動后,就要從驅動管理器獲取一個數據庫的連接,通過這個連接完成數據庫的數據操作,示例代碼如下:Connection conn =?DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
該接口常用的方法有
- ?createStatement():創建向數據庫發送sql的statement對象。
- ?prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
- ?prepareCall(sql):創建執行存儲過程的callableStatement對象。
- ?setAutoCommit(boolean?autoCommit):設置事務是否自動提交。
- ?commit() :在鏈接上提交事務
- ?rollback() :在此鏈接上回滾事務
- ?close() : 關閉連接,釋放資源
3. Statement接口
該接口主要用于SQL的執行,PreparedStatement和CallableStatement都繼承該接口,這三種用于執行SQL語句的接口區別如下
- Statement 主要用于簡單數據的查詢,不帶參數
- PreparedStatement用于帶參數的查詢,PreparedStatement對象比Statement對象的效率更高,并且可以防止SQL注入,所以一般的應用開發都是用此接口來實現SQL查詢
- CallableStatement 用于存儲過程的查詢
4.?ResultSet接口
主要是SQL查詢結果的封裝,用來實現數據的查詢的處理。
DataSource
javax.sql.DataSource接口是JDBC 2.0 API中新出現的接口,該接口提供了另一種獲取數據源的方式。在實際的應用開發中更建議使用DataSource來獲取連接,而不建議通過DriverManager來獲取連接。這樣應用程序的代碼變得可移植和易于管理,不用在程序里硬編碼數據庫的連接地址。另外,DataSounce對象可以提供連接池和分布式事務,必要的企業級數據計算,而這些功能的具體實現對于應用開發者來說是透明的。
JNDI數據源
應用程序常常部署在服務器中,如Tomcat這樣的Web容器。這些服務器允許開發人員配置通過JNDI來獲取數據源,這樣的好處是數據源完全在應用程序之外進行管理,應用程序只要專注于數據的操作就好了。其次,這些應用服務器通常是以數據池的形式管理數據源,從而具備更好的性能。如下圖所示(來自https://blog.csdn.net/zhanglf02/article/details/76726702),Web服務器上保存著一個數據庫的多個連接。一個數據源dataSource的配置對應一個數據池。每個配置的DataSource被綁定在了JNDI樹上(每個dataSource的配置都有一個唯一名稱與之對應)客戶端通過名稱找到在JNDI樹上綁定的DataSource,再由DataSource找到一個連接。
主要的開源的數據源連接池(https://blog.csdn.net/qq_25406669/article/details/80222376)
- DBCP框架
- C3P0框架
- Druid框架
DBCP是由Apache開發的一個Java數據庫連接池項目,Tomcat使用的連接池組件就是DBCP。預先將數據庫連接放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完再放回。單線程,并發量低,性能不好,適用于小型系統。
C3P0是開源的JDBC連接池,實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、Spring等。單線程,性能較差,適用于小型系統。
Druid是Java語言中最好的數據庫連接池,Druid能夠提供強大的監控和擴展功能,是一個可用于大數據實時查詢和分析的高容錯、高性能的開源分布式系統,尤其是當發生代碼部署、機器故障以及其他產品系統遇到宕機等情況時,Druid仍能夠保持100%正常運行。主要特色:為分析監控設計;快速的交互式查詢;高可用;可擴展;Druid是一個開源項目,源碼托管在github上。
Spring配置數據源
- 配置JNDI數據源
- 配置連接池數據源
- 自定義的數據源
JNDI數據源配置
位于jee命名空間下的<jee:jndi-lookup>元素可以用于檢索JNDI中的任何元素,并將其作為Spring的bean。簡要的配置示例如下:
<jee:jndi-lookup id="dataSource"jndi-name="/jdbc/SplitterDS"resource-ref="true"/>或者如下配置
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/roseindiaDB_local</value></property> </bean>jndi-name就是上文中講到的datasource配置文件中的names屬性,如果應用程序部署在web應用服務器中,需要將resource-ref為true,這樣jndi-name將會自動添加“java:comp/env/”前綴。
數據源連接池配置?
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url"> <value>jdbc:oracle:xxxx</value> </property> <property name="username"> <value>test</value> </property> <property name="password"> <value>test</value> </property> <property name="maxActive"> <value>255</value> </property> <property name="maxIdle"> <value>2</value> </property> <property name="maxWait"> <value>120000</value> </property> </bean>Spring實現的基于JDBC驅動的數據源
- DriverManagerDataSource: 每個連接請求時返回一個新建的連接
- SimpleDriverDataSource: 跟DriverManagerDataSource工作方式類似,但是它直接使用JDBC驅動來解決特定環境的類加載問題
- SingleConnectionDataSource: 每個連接請求的時候返回同一個連接,并不是嚴格意義上的連接池
總結
以上是生活随笔為你收集整理的Java数据库连接协议JDBC学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第七季4:网络telnet调试、海思pr
- 下一篇: Java实现Modbus/TCP客户端与