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