久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Java JDBC基本使用方法詳解

瀏覽:2日期:2022-09-03 08:55:43

本文實(shí)例講述了Java JDBC基本使用方法。分享給大家供大家參考,具體如下:

本文內(nèi)容: 什么是JDBC JDBC的使用 事務(wù) 連接池 DbUtils

首發(fā)日期:2018-05-27

修改:

2018-07-19:增加了事務(wù)、連接池、DBUtils 2018-07-27:對(duì)特別情況下的事務(wù)進(jìn)行了描述。對(duì)DBUtils增加了關(guān)閉資源、關(guān)閉流。連接池發(fā)現(xiàn)漏了釋放連接。什么是JDBC: JDBC全稱Java Database Connectivity JDBC可以通過載入不同的數(shù)據(jù)庫的“驅(qū)動(dòng)程序”而與不同的數(shù)據(jù)庫進(jìn)行連接。JDBC的優(yōu)點(diǎn): 使用的驅(qū)動(dòng)不同,即可連接不同的數(shù)據(jù)庫。 使用同一套操作來操作不同的數(shù)據(jù)庫 如果每一個(gè)數(shù)據(jù)庫java都制訂一套連接方式,那么當(dāng)不同的數(shù)據(jù)庫更新的時(shí)候,java也需要更新自己的代碼,而使用jdbc,使用同一套代碼來操作,使用不同的驅(qū)動(dòng)程序(驅(qū)動(dòng)程序由數(shù)據(jù)庫廠商提供)來連接,這使得可以連接不同的數(shù)據(jù)庫。JDBC的使用:導(dǎo)入對(duì)應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)類: 1.在對(duì)應(yīng)的數(shù)據(jù)庫廠商網(wǎng)站獲取對(duì)應(yīng)的jar包 2.將對(duì)應(yīng)的jar包添加到引用。 在eclipse中可以將jar包導(dǎo)入一個(gè)文件夾后,右鍵Build Path -> add to path就可以將jar包添加到當(dāng)前項(xiàng)目引用的庫里面。Java JDBC基本使用方法詳解 加載驅(qū)動(dòng): Java JDBC基本使用方法詳解

PS:

在上面的forName中,執(zhí)行了注冊驅(qū)動(dòng),注冊驅(qū)動(dòng)這個(gè)代碼被定義在驅(qū)動(dòng)類的靜態(tài)代碼塊中。 對(duì)于一些新手,使用的方法可能是Java JDBC基本使用方法詳解,對(duì)于這種情況,那么他可以使用driver或DriverManager.getConnection來獲取數(shù)據(jù)庫連接對(duì)象;而對(duì)于另外一些新手,他們可能會(huì)使用Java JDBC基本使用方法詳解,然后再通過DriverManager.getConnection來獲取數(shù)據(jù)庫連接對(duì)象。但本質(zhì)上,這是一種浪費(fèi),因?yàn)殪o態(tài)代碼塊中已經(jīng)靜態(tài)生成了一個(gè)驅(qū)動(dòng)對(duì)象并使用DriverManager.registerDriver注冊了,所以上面兩種都是浪費(fèi)。使用forName后,可以使用DriverManager.getConnection來獲取數(shù)據(jù)庫連接對(duì)象。獲取連接: 在考慮使用forName節(jié)省資源后,下面介紹的獲取連接的方法使用的是DriverManager.getConnectionJava JDBC基本使用方法詳解 getConnection需要參數(shù) url:定義了連接的數(shù)據(jù)庫的路徑 jdbc協(xié)議:數(shù)據(jù)庫子協(xié)議:主機(jī)[:端口][/連接的數(shù)據(jù)庫] 【[]代表可選的】 例如:jdbc:mysql://localhost:3306/testJava JDBC基本使用方法詳解 配置流Properties:定義了連接數(shù)據(jù)庫的方式,一般至少包含user和password 不使用配置流時(shí),傳入user和password 如果使用匿名登錄,則只傳入url

Java JDBC基本使用方法詳解

執(zhí)行SQL語句:

JDBC執(zhí)行SQL語句的方式主要有三種:

1.使用Statement執(zhí)行sql語句

2.使用PreparedStatement執(zhí)行sql語句

3.使用CallableStatement執(zhí)行sql語句

上面的Statement、PerPareStatement、Callalestatement都可以使用連接對(duì)象來獲取。

Java JDBC基本使用方法詳解

使用Statement執(zhí)行語句 Statement對(duì)象的獲取可以使用createStatement()來獲取 獲取Statement對(duì)象后,對(duì)于查詢類的sql語句使用:executeQuery(sql),sql是一個(gè)字符串sql語句,返回結(jié)果是一個(gè)結(jié)果集【如果獲取結(jié)果看下面的結(jié)果部分】 對(duì)于更新類(插入、修改、刪除、更新)的語句使用:executeUpdate(sql),sql是一個(gè)字符串sql語句,返回結(jié)果是一個(gè)整數(shù)(受影響的行數(shù))

Java JDBC基本使用方法詳解

使用PreparedStatement執(zhí)行語句 PreparedStatement對(duì)象的獲取可以使用prepareStatement(sql)來獲取,注意的是需要傳入一條sql語句 PreparedStatement的功能類似Statement,但不同的是PreparedStatement可以使用占位符,它是由占位符標(biāo)識(shí)需要輸入數(shù)據(jù)的位置,然后再逐一填入數(shù)據(jù)。當(dāng)然,PreparedStatement也可以執(zhí)行沒有占位符的sql語句 使用占位符后,使用setString或setInt等方法來設(shè)置每一位的數(shù)據(jù)?!居懈鞣N對(duì)應(yīng)數(shù)據(jù)類型的設(shè)置方法,比如還有setFloat】 setXXX方法中,第一個(gè)參數(shù)是位置,第二個(gè)是數(shù)據(jù) 獲取Statement對(duì)象后,對(duì)于查詢類的sql語句使用:executeQuery(),返回結(jié)果是一個(gè)結(jié)果集【如果獲取結(jié)果看下面的結(jié)果部分】 對(duì)于更新類(插入、修改、刪除、更新)的語句使用:executeUpdate(),返回結(jié)果是一個(gè)整數(shù)(受影響的行數(shù)) 補(bǔ)充: 對(duì)于有sql緩存池的數(shù)據(jù)庫,PreparedStatement的效率要高于Statement【有興趣的自查】

Java JDBC基本使用方法詳解

使用CallableStatement執(zhí)行語句 CallableStatement主要用來調(diào)用存儲(chǔ)過程 對(duì)于輸出參數(shù),需要使用registerOutParameter注冊,第一個(gè)參數(shù)是位置,第二個(gè)參數(shù)是參數(shù)類型(使用Types.xxx) 注冊之后,想要獲取輸出參數(shù),可以使用CallableStatement對(duì)象自身的getXXX方法來獲取

定義的存儲(chǔ)過程示例:

Java JDBC基本使用方法詳解

使用:

Java JDBC基本使用方法詳解

獲取返回: 返回結(jié)果是一個(gè)結(jié)果集,它有一個(gè)光標(biāo)指向結(jié)果的每一行,最開始它不指向結(jié)果,第一次執(zhí)行next()后,它指向第一行結(jié)果,繼續(xù)執(zhí)行next(),他會(huì)繼續(xù)指向下一行。next的返回結(jié)果是布爾值,它可以用來判斷是否有下一行。 對(duì)于每一行結(jié)果,可以使用getXXX方法(參照下面)來獲取某一列的結(jié)果,getXXX方法的參數(shù)可以為字段名,也可以為索引號(hào)(從1開始)

Java JDBC基本使用方法詳解

Java JDBC基本使用方法詳解

關(guān)閉連接: 后開啟的需要先關(guān)閉,Statement、Connection、ResultSet都是需要關(guān)閉的 注意:關(guān)閉之前需要留心檢查是否為null

Java JDBC基本使用方法詳解

事務(wù)

不了解事務(wù)是什么的,可以看一下我的另外一篇博文:mysql之事務(wù)管理

設(shè)置事務(wù)管理:

連接對(duì)象.setAutoCommit(boolean)【當(dāng)參數(shù)為true時(shí),代表允許自動(dòng)提交(事務(wù)管理是關(guān)閉的,每一條命令都會(huì)自動(dòng)提交);當(dāng)為false時(shí),代表不允許自動(dòng)提交,命令會(huì)在執(zhí)行commit之后再統(tǒng)一提交(開啟事務(wù)管理的)】

提交事務(wù):

連接對(duì)象.commit()

回滾事務(wù):

連接對(duì)象.rollback()

例子:

以銀行轉(zhuǎn)賬為例,張三轉(zhuǎn)給李四100元,執(zhí)行事務(wù)后,如果運(yùn)行出錯(cuò)將不會(huì)提交數(shù)據(jù)到數(shù)據(jù)庫:

Java JDBC基本使用方法詳解

Java JDBC基本使用方法詳解

補(bǔ)充: 有些時(shí)候,在開發(fā)中是不會(huì)把兩個(gè)操作放到一個(gè)地方的(在Javaweb中開發(fā)中存在service層和dao層??梢赃@么說,servlet是飯店前臺(tái),service層就是包廂里點(diǎn)菜的服務(wù)員(客戶需要什么菜,他負(fù)責(zé)告訴后廚),dao層就是真正做菜的后廚(dao層通常是數(shù)據(jù)庫方面的操作)。服務(wù)員一次性把需要的菜告訴后廚),這樣耦合性較高,通常需要把它們放到單獨(dú)的地方去(就好比一個(gè)大廚做好幾樣菜會(huì)很忙,通常都會(huì)分工好),比如加錢是一個(gè)函數(shù),減錢是一個(gè)函數(shù)。把他們分開后,兩個(gè)函數(shù)之間的Connection不同的話,就會(huì)無法統(tǒng)一進(jìn)行事務(wù)管理。通常有兩個(gè)解決方法:1.把同一個(gè)Connection對(duì)象傳給這兩個(gè)參數(shù)。2.利用Threadlocal類,把Connection對(duì)象存進(jìn)去,兩個(gè)要用的時(shí)候再取,取的是同一個(gè)對(duì)象?!具@里可能不容易理解,只是做個(gè)提醒,可以不理解。】數(shù)據(jù)庫連接池 連接池的意義就是提前創(chuàng)建連接,避免需要使用時(shí)再申請連接造成的重復(fù)申請資源造成的浪費(fèi)。 連接池負(fù)責(zé)在需要的時(shí)候分發(fā)連接,使用者釋放連接時(shí)需要放回到連接池中。

連接池可以自定義,當(dāng)然常用的一般都是選擇采用第三方開源的連接池,想了解如何自定義連接池的可以自查,下面給出的是兩個(gè)常用的連接池的用法。

DBCP:

首先,使用DBCP連接池需要導(dǎo)入包:commons-dbcp.jar和commons-pool.jar【如果需要日志功能,還需要commons-logging-1.2.jar ,這里不講述】

DBCP根據(jù)配置方式,下面給出兩種使用方法:

1.手動(dòng)配置法:

創(chuàng)建BasicDataSource對(duì)象: BasicDataSource dataSource = new BasicDataSource(); 配置BasicDataSource對(duì)象:(少用)調(diào)用對(duì)應(yīng)函數(shù)配置,例如dataSource.setDriverClassName('com.mysql.jdbc.Driver'); 得到連接對(duì)象:Connection conn = ds.getConnection(); 操作數(shù)據(jù)庫。(得到數(shù)據(jù)庫連接對(duì)象后,就可以像以前一樣去操作數(shù)據(jù)庫了)

Java JDBC基本使用方法詳解

2.配置文件配置法:

創(chuàng)建BasicDataSourceFactory對(duì)象:BasicDataSourceFactory factory = new BasicDataSourceFactory(); 利用BasicDataSourceFactory對(duì)象的createDataSource函數(shù)讀取配置文件配置DataSource對(duì)象:DataSource dataSource = factory.createDataSource(properties);【配置文件能用哪些參數(shù)可以參考這個(gè)文檔:http://commons.apache.org/proper/commons-dbcp/configuration.html】 得到連接對(duì)象:Connection conn = ds.getConnection(); 操作數(shù)據(jù)庫。(得到數(shù)據(jù)庫連接對(duì)象后,就可以像以前一樣去操作數(shù)據(jù)庫了)

Java JDBC基本使用方法詳解

當(dāng)使用完畢后,像往常一樣調(diào)用close關(guān)閉連接即可【這里通過連接池獲取的Connection對(duì)象已經(jīng)封裝過了,使用close函數(shù)相當(dāng)于放回連接池中】

常用的dbcp.properties的配置信息:

#連接設(shè)置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/jdbcusername=rootpassword=

#<!-- 初始化連接 -->initialSize=10

#最大連接數(shù)量maxActive=50

#<!-- 最大空閑連接 -->maxIdle=20

#<!-- 最小空閑連接 -->minIdle=5

#<!-- 超時(shí)等待時(shí)間以毫秒為單位 6000毫秒/1000等于60秒 -->maxWait=60000

#JDBC驅(qū)動(dòng)建立連接時(shí)附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;] #注意:'user' 與 'password' 兩個(gè)屬性會(huì)被明確地傳遞,因此這里不需要包含他們。connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由連接池所創(chuàng)建的連接的自動(dòng)提交(auto-commit)狀態(tài)。defaultAutoCommit=true

#driver default 指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別(TransactionIsolation)。#可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLEdefaultTransactionIsolation=READ_UNCOMMITTED

C3P0:

首先,使用C3P0連接池需要導(dǎo)入包:c3p0-0.9.1.2.jar【還有擴(kuò)展包如c3p0-oracle-thin-extras-0.9.1.2.jar,這里不講】

手動(dòng)配置法:

創(chuàng)建ComboPooledDataSource對(duì)象:ComboPooledDataSource dataSource = new ComboPooledDataSource(); 調(diào)用對(duì)應(yīng)函數(shù)配置對(duì)應(yīng)屬性

Java JDBC基本使用方法詳解

配置文件配置法:

創(chuàng)建配置文件,c3p0的配置文件名字是固定的,必須是c3p0.properties或c3p0-config.xml,否則識(shí)別不了。配置文件的寫法看下面【配置文件存儲(chǔ)的位置:1.能在classpath中獲取到的目錄(比如工程的src目錄)、2.WEB-INF/classes、3.某些類似功能的路徑】 創(chuàng)建ComboPooledDataSource對(duì)象【如果有配置文件,那么會(huì)讀取配置文件來配置ComboPooledDataSource對(duì)象】 獲取連接 執(zhí)行sql語句

Java JDBC基本使用方法詳解

當(dāng)你使用完后,Connection對(duì)象調(diào)用close函數(shù),就會(huì)把連接釋放會(huì)連接池中【這里通過連接池獲取的Connection對(duì)象已經(jīng)封裝過了,使用close函數(shù)相當(dāng)于放回連接池中】

配置文件c3p0-config.xml的寫法:

<c3p0-config> <default-config> <property name='driverClass'>com.mysql.jdbc.Driver</property> <property name='jdbcUrl'>jdbc:mysql://localhost/bank</property> <property name='user'>root</property> <property name='password'>123456</property> <!-- 下面的是額外的配置,如最大連接數(shù),連接池大小。。 <property name='initialPoolSize'>10</property> <property name='maxIdleTime'>30</property> <property name='maxPoolSize'>100</property> <property name='minPoolSize'>10</property> <property name='maxStatements'>200</property> --> </default-config> <!-- 上面是默認(rèn)的,如果不給參數(shù),默認(rèn)是上面的; --> <!-- 下面的是單獨(dú)的,在創(chuàng)建對(duì)象時(shí)把下面name中的那個(gè)值賦給對(duì)象的構(gòu)造函數(shù),那么將使用下面的配置 --> <named-config name='student'> <property name='driverClass'>com.mysql.jdbc.Driver</property> <property name='jdbcUrl'>jdbc:mysql://localhost/student</property> <property name='user'>root</property> <property name='password'>123456</property> </named-config></c3p0-config>

配置文件c3p0.properties的寫法:

c3p0.driverClass=com.mysql.jdbc.Driverc3p0.jdbcUrl=jdbc:mysql://localhost/bankc3p0.user=rootc3p0.password=123456

想更詳細(xì)的了解c3p0,可以參考官方文檔:https://www.mchange.com/projects/c3p0/index.html

怎樣去配置c3p0連接池,什么英語代表什么意思,具體請參考:https://www.mchange.com/projects/c3p0/index.html

補(bǔ)充: 事實(shí)上DBCP和c3p0還有不少使用方法,上面只講解了常用的。DbUtils DbUtils是apache旗下的一個(gè)操作數(shù)據(jù)庫的工具 DbUtils可以簡化我們對(duì)數(shù)據(jù)庫的CRUD操作,一個(gè)常用功能是能把查詢到的數(shù)據(jù)自動(dòng)封裝起來,而不再需要我們操作ResultSet。

要想使用DBUtils,首先要導(dǎo)入包:commons-dbutils-1.4.jar

增、刪、改: DbUtils的寫操作是一類,讀操作是一類 寫操作主要是調(diào)用update函數(shù)

1.新建QueryRunner對(duì)象【如果傳入一個(gè)連接池對(duì)象,那么后續(xù)操作的數(shù)據(jù)庫連接就是這個(gè)連接池的連接;如果不設(shè)置,那么執(zhí)行update時(shí)要給一個(gè)連接對(duì)象】

2.調(diào)用update函數(shù).

update()有多個(gè)重構(gòu)函數(shù),可以依據(jù)情況來選擇使用:

Java JDBC基本使用方法詳解

Java JDBC基本使用方法詳解

Java JDBC基本使用方法詳解

查: 寫操作主要是調(diào)用query函數(shù) 查詢操作的同時(shí),可以配合javabean把數(shù)據(jù)封裝起來(數(shù)據(jù)返回的數(shù)據(jù)在ResultSet中,傳入一個(gè)ResultSetHandler對(duì)象以操作ResultSet中的數(shù)據(jù))。 如下圖所示,ResultSetHandler對(duì)象是必須的參數(shù),所以說,查出數(shù)據(jù)但不處理的操作不要使用DBUtils。

Java JDBC基本使用方法詳解

自定義操作數(shù)據(jù):調(diào)用ResultSetHandler的匿名實(shí)現(xiàn)類中的handle方法處理resultset的數(shù)據(jù)

Java JDBC基本使用方法詳解

手動(dòng)封裝:調(diào)用ResultSetHandler的實(shí)現(xiàn)類中的handle方法來講resultset的數(shù)據(jù)封裝到對(duì)象中

Java JDBC基本使用方法詳解

自動(dòng)封裝數(shù)據(jù):根據(jù)傳入的ResultSetHandler對(duì)象來處理數(shù)據(jù)

Java JDBC基本使用方法詳解

常見ResultSetHandler實(shí)現(xiàn)類: BeanHandler :把數(shù)據(jù)庫中的一行數(shù)據(jù)根據(jù)變量名自動(dòng)封裝到對(duì)象中;如果查詢語句返回多條結(jié)果,將ResultSet中第一行的數(shù)據(jù)根據(jù)變量名自動(dòng)封裝到對(duì)象中 BeanListHandler:把數(shù)據(jù)庫中的多行數(shù)據(jù)根據(jù)變量名自動(dòng)封裝到對(duì)象中,并存儲(chǔ)到List中返回。所以返回結(jié)果是一個(gè)含有多個(gè)bean對(duì)象的list ScalarHandler :將ResultSet中一條記錄的某一列的數(shù)據(jù)存成Object,返回值是一個(gè)Object。不給參數(shù)時(shí)默認(rèn)是第一列的值,參數(shù)可以給列數(shù),也可以給字段名 【可以用于統(tǒng)計(jì)函數(shù)等返回一個(gè)值的情況】 ArrayHandler :把一條記錄的所有數(shù)據(jù)存儲(chǔ)到一個(gè)數(shù)組中,第一列的數(shù)據(jù)在數(shù)組的第一個(gè)位置。 ArrayListHandler:與ArrayHandler功能類似,但可以返回包含多個(gè)數(shù)組的list了。

補(bǔ)充:對(duì)于封裝成對(duì)象的,需要提供一個(gè)bean類.class參數(shù),這是為了能創(chuàng)建對(duì)象

關(guān)閉流、釋放資源:

DbUtils中提供了可以關(guān)閉各種資源的靜態(tài)方法

Java JDBC基本使用方法詳解

Java JDBC基本使用方法詳解

補(bǔ)充: 由于DbUtils支持傳入一個(gè)Connection對(duì)象,所以在一些比如轉(zhuǎn)賬的事務(wù)管理中,若是加錢和減錢在不同函數(shù)中,DbUtils可以借助傳入同一個(gè)Connection對(duì)象來實(shí)現(xiàn)事務(wù)管理。

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java使用JDBC操作數(shù)據(jù)庫技巧總結(jié)》、《Java+MySQL數(shù)據(jù)庫程序設(shè)計(jì)總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java文件與目錄操作技巧匯總》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 久久久久久久久久久久久久久久久久久 | 欧美视频xxx | 日韩视频在线观看中文字幕 | 日韩中文字幕在线看 | 成人午夜电影在线观看 | 亚洲毛片 | 欧美午夜一区二区三区免费大片 | 日韩一区二区三区精品 | 国产在线一级片 | 天堂久久爱资源站www | 欧美精品区 | 色九九| m豆传媒在线链接观看 | 国产一区二区三区免费播放 | 中文字幕在线网址 | 久久久亚洲一区 | www一区| 免费激情网站 | 天天躁日日躁aaaaxxxx | 欧美黑人一级毛片 | 国产一区二区三区在线免费观看 | 日韩欧美国产一区二区 | 狠狠av | 欧美成人性生活视频 | 日韩在线观看中文字幕 | 91 在线观看 | 亚洲二区在线视频 | 久久精品欧美 | 亚洲精品系列 | 国产日韩欧美 | 一级做a爰片毛片 | 操视频网站 | 欧美一区免费 | 国产精品视频 | 中国国产一级毛片 | 国产成人一区 | 一区二区三区在线免费播放 | 99精品免费视频 | 黄色网亚洲 | 国产主播久久 | 精品久久久久久久久久久久 |