中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Java中的JDBC

發布時間:2020-08-04 13:54:51 來源:億速云 閱讀:205 作者:小豬 欄目:編程語言

這篇文章主要講解了如何使用Java中的JDBC,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

什么是JDBC:

  • JDBC全稱Java Database Connectivity
  • JDBC可以通過載入不同的數據庫的“驅動程序”而與不同的數據庫進行連接。

JDBC的優點:

  • 使用的驅動不同,即可連接不同的數據庫。
  • 使用同一套操作來操作不同的數據庫
  • 如果每一個數據庫java都制訂一套連接方式,那么當不同的數據庫更新的時候,java也需要更新自己的代碼,而使用jdbc,使用同一套代碼來操作,使用不同的驅動程序(驅動程序由數據庫廠商提供)來連接,這使得可以連接不同的數據庫。

JDBC的使用:

導入對應數據庫的驅動類:

  • 1.在對應的數據庫廠商網站獲取對應的jar包
  • 2.將對應的jar包添加到引用。
    • 在eclipse中可以將jar包導入一個文件夾后,右鍵Build Path -> add to path就可以將jar包添加到當前項目引用的庫里面。如何使用Java中的JDBC

加載驅動:

  • 如何使用Java中的JDBC

PS:

  • 在上面的forName中,執行了注冊驅動,注冊驅動這個代碼被定義在驅動類的靜態代碼塊中。
  • 對于一些新手,使用的方法可能是如何使用Java中的JDBC,對于這種情況,那么他可以使用driver或DriverManager.getConnection來獲取數據庫連接對象;而對于另外一些新手,他們可能會使用如何使用Java中的JDBC,然后再通過DriverManager.getConnection來獲取數據庫連接對象。但本質上,這是一種浪費,因為靜態代碼塊中已經靜態生成了一個驅動對象并使用DriverManager.registerDriver注冊了,所以上面兩種都是浪費。使用forName后,可以使用DriverManager.getConnection來獲取數據庫連接對象。

獲取連接:

  • 在考慮使用forName節省資源后,下面介紹的獲取連接的方法使用的是DriverManager.getConnection如何使用Java中的JDBC
  • getConnection需要參數  
    • url:定義了連接的數據庫的路徑    
      • jdbc協議:數據庫子協議:主機[:端口][/連接的數據庫]  【[]代表可選的】
      • 例如:jdbc:mysql://localhost:3306/test如何使用Java中的JDBC
    • 配置流Properties:定義了連接數據庫的方式,一般至少包含user和password
    • 不使用配置流時,傳入user和password
    • 如果使用匿名登錄,則只傳入url

如何使用Java中的JDBC

執行SQL語句:

JDBC執行SQL語句的方式主要有三種:

1.使用Statement執行sql語句

2.使用PreparedStatement執行sql語句

3.使用CallableStatement執行sql語句

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

如何使用Java中的JDBC

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

如何使用Java中的JDBC

  • 使用PreparedStatement執行語句
    • PreparedStatement對象的獲取可以使用prepareStatement(sql)來獲取,注意的是需要傳入一條sql語句
    • PreparedStatement的功能類似Statement,但不同的是PreparedStatement可以使用占位符,它是由占位符標識需要輸入數據的位置,然后再逐一填入數據。當然,PreparedStatement也可以執行沒有占位符的sql語句
      • 使用占位符后,使用setStringsetInt等方法來設置每一位的數據。【有各種對應數據類型的設置方法,比如還有setFloat
        • setXXX方法中,第一個參數是位置,第二個是數據
    • 獲取Statement對象后,對于查詢類的sql語句使用:executeQuery(),返回結果是一個結果集【如果獲取結果看下面的結果部分】
    • 對于更新類(插入、修改、刪除、更新)的語句使用:executeUpdate(),返回結果是一個整數(受影響的行數)
    • 補充:
      • 對于有sql緩存池的數據庫,PreparedStatement的效率要高于Statement【有興趣的自查】

如何使用Java中的JDBC

  • 使用CallableStatement執行語句
    • CallableStatement主要用來調用存儲過程
    • 對于輸出參數,需要使用registerOutParameter注冊,第一個參數是位置,第二個參數是參數類型(使用Types.xxx)
    • 注冊之后,想要獲取輸出參數,可以使用CallableStatement對象自身的getXXX方法來獲取

定義的存儲過程示例:

如何使用Java中的JDBC

使用:

如何使用Java中的JDBC

獲取返回:

  • 返回結果是一個結果集,它有一個光標指向結果的每一行,最開始它不指向結果,第一次執行next()后,它指向第一行結果,繼續執行next(),他會繼續指向下一行。next的返回結果是布爾值,它可以用來判斷是否有下一行。
    • 對于每一行結果,可以使用getXXX方法(參照下面)來獲取某一列的結果,getXXX方法的參數可以為字段名,也可以為索引號(從1開始)

如何使用Java中的JDBC

如何使用Java中的JDBC

關閉連接:

  • 后開啟的需要先關閉,Statement、Connection、ResultSet都是需要關閉的
  • 注意:關閉之前需要留心檢查是否為null

如何使用Java中的JDBC


事務

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

設置事務管理:

連接對象.setAutoCommit(boolean)【當參數為true時,代表允許自動提交(事務管理是關閉的,每一條命令都會自動提交);當為false時,代表不允許自動提交,命令會在執行commit之后再統一提交(開啟事務管理的)】

提交事務:

連接對象.commit()

回滾事務:

連接對象.rollback()

例子:

以銀行轉賬為例,張三轉給李四100元,執行事務后,如果運行出錯將不會提交數據到數據庫:

如何使用Java中的JDBC

如何使用Java中的JDBC

補充:

  • 有些時候,在開發中是不會把兩個操作放到一個地方的(在Javaweb中開發中存在service層和dao層。可以這么說,servlet是飯店前臺,service層就是包廂里點菜的服務員(客戶需要什么菜,他負責告訴后廚),dao層就是真正做菜的后廚(dao層通常是數據庫方面的操作)。服務員一次性把需要的菜告訴后廚),這樣耦合性較高,通常需要把它們放到單獨的地方去(就好比一個大廚做好幾樣菜會很忙,通常都會分工好),比如加錢是一個函數,減錢是一個函數。把他們分開后,兩個函數之間的Connection不同的話,就會無法統一進行事務管理。通常有兩個解決方法:1.把同一個Connection對象傳給這兩個參數。2.利用Threadlocal類,把Connection對象存進去,兩個要用的時候再取,取的是同一個對象。【這里可能不容易理解,只是做個提醒,可以不理解。】

數據庫連接池

  • 連接池的意義就是提前創建連接,避免需要使用時再申請連接造成的重復申請資源造成的浪費。
  • 連接池負責在需要的時候分發連接,使用者釋放連接時需要放回到連接池中。

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

DBCP:

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

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

1.手動配置法:

  1. 創建BasicDataSource對象: BasicDataSource dataSource = new BasicDataSource();
  2. 配置BasicDataSource對象:(少用)調用對應函數配置,例如dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  3. 得到連接對象:Connection conn = ds.getConnection();
  4. 操作數據庫。(得到數據庫連接對象后,就可以像以前一樣去操作數據庫了)

如何使用Java中的JDBC

2.配置文件配置法:

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

如何使用Java中的JDBC

當使用完畢后,像往常一樣調用close關閉連接即可【這里通過連接池獲取的Connection對象已經封裝過了,使用close函數相當于放回連接池中】

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

#連接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=

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

#最大連接數量
maxActive=50

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

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

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


#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;]
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這里不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true

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

C3P0:

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

手動配置法:

  1. 創建ComboPooledDataSource對象:ComboPooledDataSource dataSource = new ComboPooledDataSource();
  2. 調用對應函數配置對應屬性

如何使用Java中的JDBC

配置文件配置法:

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

如何使用Java中的JDBC

當你使用完后,Connection對象調用close函數,就會把連接釋放會連接池中【這里通過連接池獲取的Connection對象已經封裝過了,使用close函數相當于放回連接池中】

配置文件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>
    <!-- 下面的是額外的配置,如最大連接數,連接池大小。。 
    <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>
  <!-- 上面是默認的,如果不給參數,默認是上面的; -->
  <!-- 下面的是單獨的,在創建對象時把下面name中的那個值賦給對象的構造函數,那么將使用下面的配置 -->
  <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.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost/bank
c3p0.user=root
c3p0.password=123456

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

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

補充:

  • 事實上DBCP和c3p0還有不少使用方法,上面只講解了常用的。

DbUtils

  • DbUtils是apache旗下的一個操作數據庫的工具
  • DbUtils可以簡化我們對數據庫的CRUD操作,一個常用功能是能把查詢到的數據自動封裝起來,而不再需要我們操作ResultSet。

要想使用DBUtils,首先要導入包:commons-dbutils-1.4.jar

增、刪、改:

  • DbUtils的寫操作是一類,讀操作是一類
  • 寫操作主要是調用update函數

1.新建QueryRunner對象【如果傳入一個連接池對象,那么后續操作的數據庫連接就是這個連接池的連接;如果不設置,那么執行update時要給一個連接對象】

2.調用update函數.

update()有多個重構函數,可以依據情況來選擇使用:

如何使用Java中的JDBC

如何使用Java中的JDBC

如何使用Java中的JDBC

查:

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

如何使用Java中的JDBC

自定義操作數據:調用ResultSetHandler的匿名實現類中的handle方法處理resultset的數據

如何使用Java中的JDBC

手動封裝:調用ResultSetHandler的實現類中的handle方法來講resultset的數據封裝到對象中

如何使用Java中的JDBC

自動封裝數據:根據傳入的ResultSetHandler對象來處理數據

如何使用Java中的JDBC

常見ResultSetHandler實現類:

  • BeanHandler :把數據庫中的一行數據根據變量名自動封裝到對象中;如果查詢語句返回多條結果,將ResultSet中第一行的數據根據變量名自動封裝到對象中
  • BeanListHandler:把數據庫中的多行數據根據變量名自動封裝到對象中,并存儲到List中返回。所以返回結果是一個含有多個bean對象的list
  • ScalarHandler :將ResultSet中一條記錄的某一列的數據存成Object,返回值是一個Object。不給參數時默認是第一列的值,參數可以給列數,也可以給字段名 【可以用于統計函數等返回一個值的情況】
  • ArrayHandler :把一條記錄的所有數據存儲到一個數組中,第一列的數據在數組的第一個位置。
  • ArrayListHandler:與ArrayHandler功能類似,但可以返回包含多個數組的list了。

補充:對于封裝成對象的,需要提供一個bean類.class參數,這是為了能創建對象

關閉流、釋放資源:

DbUtils中提供了可以關閉各種資源的靜態方法

如何使用Java中的JDBC

如何使用Java中的JDBC

補充:

  • 由于DbUtils支持傳入一個Connection對象,所以在一些比如轉賬的事務管理中,若是加錢和減錢在不同函數中,DbUtils可以借助傳入同一個Connection對象來實現事務管理。

看完上述內容,是不是對如何使用Java中的JDBC有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸西县| 明光市| 南郑县| 德格县| 枝江市| 乐平市| 康定县| 博客| 辽源市| 盱眙县| 陇西县| 天柱县| 东安县| 亳州市| 凤翔县| 乡城县| 外汇| 南靖县| 仙游县| 昂仁县| 无极县| 漯河市| 遵义县| 达日县| 忻城县| 区。| 新建县| 庆云县| 十堰市| 星子县| 岳西县| 江山市| 莱芜市| 平乐县| 右玉县| 崇信县| 新野县| 西乌| 桐庐县| 石棉县| 桃园市|