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是獨立的數(shù)據(jù)庫連接工業(yè)標(biāo)準(zhǔn)協(xié)議,這個數(shù)據(jù)庫連接指的是Java編程語言和各種各樣數(shù)據(jù)庫的連接。JDBC API提供了通過SQL語言獲取數(shù)據(jù)的一套可調(diào)用接口API。JDBC技術(shù)允許開發(fā)者在開發(fā)企業(yè)數(shù)據(jù)獲取的應(yīng)用中,使用JAVA語言來實現(xiàn)“一次寫入,多地運行”的能力。
就我的理解而言,JDBC是Java用來實現(xiàn)各種各樣數(shù)據(jù)庫連接的一套標(biāo)準(zhǔn)化接口協(xié)議。JDBC API定義了如何獲取/修改數(shù)據(jù)庫中的數(shù)據(jù)。由于不同的數(shù)據(jù)庫操作數(shù)據(jù)的底層協(xié)議不同,因此不同的數(shù)據(jù)庫廠商會提供對應(yīng)的數(shù)據(jù)庫驅(qū)動,比如mysql有提供給Java的驅(qū)動mysql-connection-java-xxx.jar, oracle有提供給Java的驅(qū)動ojdbcxx.jar,sqlserver有提供給Java的驅(qū)動sqljdbcxx.jar等等。當(dāng)然,這些數(shù)據(jù)庫廠商也有提供給其他編程語言的數(shù)據(jù)庫連接驅(qū)動,比如mysql提供給c++的驅(qū)動mysql-connector-c++-8.0.13-macos10.14-x86-64bit.dmg等等。而這些驅(qū)動會實現(xiàn)JDBC API,將其轉(zhuǎn)化成對應(yīng)數(shù)據(jù)庫協(xié)議,從而實現(xiàn)了對數(shù)據(jù)的操作。
JDBC整體架構(gòu)
JDBC API包含兩個主要的接口集合: 第一個就是為應(yīng)用寫數(shù)據(jù)者提供的JDBC API, 第二個就是為驅(qū)動寫數(shù)據(jù)提供的更底層的JDBC驅(qū)動API. 應(yīng)用可以通過JDBC API獲取數(shù)據(jù),通過基于JAVA JDBC技術(shù)實現(xiàn)的驅(qū)動,如下圖所示
左邊這條線路表示驅(qū)動會把JDBC的接口調(diào)用轉(zhuǎn)換成關(guān)系型數(shù)據(jù)庫所使用的網(wǎng)絡(luò)協(xié)議,允許一個來自客戶端機(jī)器的數(shù)據(jù)調(diào)用直接傳遞給對應(yīng)的關(guān)系型數(shù)據(jù)庫服務(wù)器,同時提供內(nèi)部網(wǎng)的解決方案。
右邊這條線路則表示驅(qū)動會將JDBC的調(diào)用轉(zhuǎn)換成中間件供應(yīng)商的協(xié)議,中間件服務(wù)器再將中間件的協(xié)議轉(zhuǎn)換成關(guān)系型數(shù)據(jù)庫的協(xié)議。中間件提供了對很多數(shù)據(jù)庫的連接。
JDBC API
1.Driver接口
在操作數(shù)據(jù)庫中的數(shù)據(jù)之前,先要加載對應(yīng)的數(shù)據(jù)庫驅(qū)動,如加載mysql對應(yīng)的數(shù)據(jù)庫驅(qū)動示例代碼如下:Class.forName("com.mysql.jdbc.Driver");
2.Connection接口
加載完驅(qū)動后,就要從驅(qū)動管理器獲取一個數(shù)據(jù)庫的連接,通過這個連接完成數(shù)據(jù)庫的數(shù)據(jù)操作,示例代碼如下:Connection conn =?DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
該接口常用的方法有
- ?createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對象。
- ?prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預(yù)編譯sql的PrepareSatement對象。
- ?prepareCall(sql):創(chuàng)建執(zhí)行存儲過程的callableStatement對象。
- ?setAutoCommit(boolean?autoCommit):設(shè)置事務(wù)是否自動提交。
- ?commit() :在鏈接上提交事務(wù)
- ?rollback() :在此鏈接上回滾事務(wù)
- ?close() : 關(guān)閉連接,釋放資源
3. Statement接口
該接口主要用于SQL的執(zhí)行,PreparedStatement和CallableStatement都繼承該接口,這三種用于執(zhí)行SQL語句的接口區(qū)別如下
- Statement 主要用于簡單數(shù)據(jù)的查詢,不帶參數(shù)
- PreparedStatement用于帶參數(shù)的查詢,PreparedStatement對象比Statement對象的效率更高,并且可以防止SQL注入,所以一般的應(yīng)用開發(fā)都是用此接口來實現(xiàn)SQL查詢
- CallableStatement 用于存儲過程的查詢
4.?ResultSet接口
主要是SQL查詢結(jié)果的封裝,用來實現(xiàn)數(shù)據(jù)的查詢的處理。
DataSource
javax.sql.DataSource接口是JDBC 2.0 API中新出現(xiàn)的接口,該接口提供了另一種獲取數(shù)據(jù)源的方式。在實際的應(yīng)用開發(fā)中更建議使用DataSource來獲取連接,而不建議通過DriverManager來獲取連接。這樣應(yīng)用程序的代碼變得可移植和易于管理,不用在程序里硬編碼數(shù)據(jù)庫的連接地址。另外,DataSounce對象可以提供連接池和分布式事務(wù),必要的企業(yè)級數(shù)據(jù)計算,而這些功能的具體實現(xiàn)對于應(yīng)用開發(fā)者來說是透明的。
JNDI數(shù)據(jù)源
應(yīng)用程序常常部署在服務(wù)器中,如Tomcat這樣的Web容器。這些服務(wù)器允許開發(fā)人員配置通過JNDI來獲取數(shù)據(jù)源,這樣的好處是數(shù)據(jù)源完全在應(yīng)用程序之外進(jìn)行管理,應(yīng)用程序只要專注于數(shù)據(jù)的操作就好了。其次,這些應(yīng)用服務(wù)器通常是以數(shù)據(jù)池的形式管理數(shù)據(jù)源,從而具備更好的性能。如下圖所示(來自https://blog.csdn.net/zhanglf02/article/details/76726702),Web服務(wù)器上保存著一個數(shù)據(jù)庫的多個連接。一個數(shù)據(jù)源dataSource的配置對應(yīng)一個數(shù)據(jù)池。每個配置的DataSource被綁定在了JNDI樹上(每個dataSource的配置都有一個唯一名稱與之對應(yīng))客戶端通過名稱找到在JNDI樹上綁定的DataSource,再由DataSource找到一個連接。
主要的開源的數(shù)據(jù)源連接池(https://blog.csdn.net/qq_25406669/article/details/80222376)
- DBCP框架
- C3P0框架
- Druid框架
DBCP是由Apache開發(fā)的一個Java數(shù)據(jù)庫連接池項目,Tomcat使用的連接池組件就是DBCP。預(yù)先將數(shù)據(jù)庫連接放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫連接時直接到連接池中申請一個就行,用完再放回。單線程,并發(fā)量低,性能不好,適用于小型系統(tǒng)。
C3P0是開源的JDBC連接池,實現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC3規(guī)范和JDBC2的標(biāo)準(zhǔn)擴(kuò)展。目前使用它的開源項目有Hibernate、Spring等。單線程,性能較差,適用于小型系統(tǒng)。
Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,是一個可用于大數(shù)據(jù)實時查詢和分析的高容錯、高性能的開源分布式系統(tǒng),尤其是當(dāng)發(fā)生代碼部署、機(jī)器故障以及其他產(chǎn)品系統(tǒng)遇到宕機(jī)等情況時,Druid仍能夠保持100%正常運行。主要特色:為分析監(jiān)控設(shè)計;快速的交互式查詢;高可用;可擴(kuò)展;Druid是一個開源項目,源碼托管在github上。
Spring配置數(shù)據(jù)源
- 配置JNDI數(shù)據(jù)源
- 配置連接池數(shù)據(jù)源
- 自定義的數(shù)據(jù)源
JNDI數(shù)據(jù)源配置
位于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屬性,如果應(yīng)用程序部署在web應(yīng)用服務(wù)器中,需要將resource-ref為true,這樣jndi-name將會自動添加“java:comp/env/”前綴。
數(shù)據(jù)源連接池配置?
<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實現(xiàn)的基于JDBC驅(qū)動的數(shù)據(jù)源
- DriverManagerDataSource: 每個連接請求時返回一個新建的連接
- SimpleDriverDataSource: 跟DriverManagerDataSource工作方式類似,但是它直接使用JDBC驅(qū)動來解決特定環(huán)境的類加載問題
- SingleConnectionDataSource: 每個連接請求的時候返回同一個連接,并不是嚴(yán)格意義上的連接池
總結(jié)
以上是生活随笔為你收集整理的Java数据库连接协议JDBC学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第七季4:网络telnet调试、海思pr
- 下一篇: afn post请求上传文件_iOS利用