JDBC連接數據庫的四種方式:DriverManager,DataSource,DBCP,C3P0


方法1:使用java.sql.DriverManager類

驅動管理器類,用於管理所有注冊的驅動程序。

(注:DataSource 接口是 JDBC 2.0 API 中的新增內容,它提供了連接到數據源的另一種方法。使用 DataSource 對象是連接到數據源的首選方法。)

常用的兩個API

registerDriver(driver)  : 注冊驅動類對象

ConnectiongetConnection(url,user,password);  獲取連接對象

  1. @Test
  2. public void test1(){
  3. Statement stmt = null;
  4. Connection conn = null;
  5. try {
  6. //1.驅動注冊程序 --內部執行了RegisterDriver
  7. Class.forName( "com.mysql.jdbc.Driver");
  8.  
  9. //2.獲取連接對象
  10. conn = DriverManager.getConnection(url, user, password);
  11.  
  12. //3.創建Statement
  13. stmt = conn.createStatement();
  14.  
  15. //4.准備sql
  16. String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),gender VARCHAR(2))";
  17.  
  18. //5.發送sql語句,執行sql語句,得到返回結果
  19. int count = stmt.executeUpdate(sql);
  20.  
  21. //6.輸出
  22. System.out.println( "影響了"+count+"行!");
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. throw new RuntimeException(e);
  26. } finally{
  27. //7.關閉連接(順序:后打開的先關閉)
  28. if(stmt!=null)
  29. try {
  30. stmt.close();
  31. } catch (SQLException e) {
  32. e.printStackTrace();
  33. throw new RuntimeException(e);
  34. }
  35. if(conn!=null)
  36. try {
  37. conn.close();
  38. } catch (SQLException e) {
  39. e.printStackTrace();
  40. throw new RuntimeException(e);
  41. }
  42. }
  43. }

方法2:使用實現了javax.sql.DataSource接口的子類

javax.sql.DataSource接口

包名:javax.sql

接口名: DataSource

作為 DriverManager 工具的替代項,DataSource 對象是獲取連接的首選方法。DataSource接口由驅動程序供應商實現。共有三種類型的實現:

1. 基本實現 - 生成標准的 Connection 對象

2. 連接池實現 - 生成自動參與連接池的 Connection 對象。此實現與中間層連接池管理器一起使用。

3. 分布式事務實現 - 生成一個 Connection 對象,該對象可用於分布式事務,大多數情況下總是參與連接池。此實現與中間層事務管理器一起使用,大多數情況下總是與連接池管理器一起使用。

 

自己實現DataSource子類這種方法不常用,常用的方法可以參考方法3和方法4

 

插入一句:Sun公司約定:如果是連接池技術,都需要實現javax.sql.DataSource接口

 

方法3:DBCP連接池

DBCP 是 Apache 軟件基金組織下的開源連接池實現,使用DBCP數據源,應用程序應在系統中增加如下兩個 jar 文件:

Commons-dbcp.jar:連接池的實現

Commons-pool.jar:連接池實現的依賴庫

Tomcat 的連接池正是采用該連接池來實現的。該數據庫連接池既可以與應用服務器整合使用,也可由應用程序獨立使用。

 

核心類:BasicDataSource

包名:org.apache.commons.dbcp
類名:ClassBasicDataSource extends Object implements DataSource

Basicimplementation of javax.sql.DataSource that is configured via JavaBeansproperties. This is not the only way to combine the commons-dbcp andcommons-pool packages, but provides a "one stop shopping" solutionfor basic requirements.

2. 兩種方式實現連接池

1)硬編碼方式

2)配置方式

  1. public class App_DBCP {
  2.  
  3. // 1. 硬編碼方式實現連接池
  4. @Test
  5. public void testDbcp() throws Exception {
  6. // DBCP連接池核心類
  7. BasicDataSource dataSouce = new BasicDataSource();
  8. // 連接池參數配置:初始化連接數、最大連接數 / 連接字符串、驅動、用戶、密碼
  9. dataSouce.setUrl( "jdbc:mysql:///jdbc_demo"); //數據庫連接字符串
  10. dataSouce.setDriverClassName( "com.mysql.jdbc.Driver"); //數據庫驅動
  11. dataSouce.setUsername( "root"); //數據庫連接用戶
  12. dataSouce.setPassword( "root"); //數據庫連接密碼
  13. dataSouce.setInitialSize( 3); // 初始化連接
  14. dataSouce.setMaxActive( 6); // 最大連接
  15. // 獲取連接
  16. Connection con = dataSouce.getConnection();
  17. con.prepareStatement( "delete from admin where id=3").executeUpdate();
  18. // 關閉
  19. con.close();
  20. }
  21.  
  22. @Test
  23. // 2. 【推薦】配置方式實現連接池, 便於維護
  24. public void testProp() throws Exception {
  25. // 加載prop配置文件
  26. Properties prop = new Properties();
  27. // 獲取文件流
  28. InputStream inStream = App_DBCP.class.getResourceAsStream( "db.properties");
  29. // 加載屬性配置文件
  30. prop.load(inStream);
  31. // 根據prop配置,直接創建數據源對象
  32. DataSource dataSouce = BasicDataSourceFactory.createDataSource(prop);
  33.  
  34. // 獲取連接
  35. Connection con = dataSouce.getConnection();
  36. con.prepareStatement( "delete from admin where id=4").executeUpdate();
  37. // 關閉
  38. con.close();
  39. }
  40. }

配置方式實現DBCP連接池,  配置文件中的key與BaseDataSouce中的屬性一樣:

db.properties

url=jdbc:mysql:///jdbc_demo

driverClassName=com.mysql.jdbc.Driver

username=root

password=root

initialSize=3

maxActive=6

方法4:C3P0連接池

C3P0連接池:

         最常用的連接池技術!Spring框架,默認支持C3P0連接池技術!

 

C3P0連接池,核心類:

CombopooledDataSource ds;

包名:com.mchange.v2.c3p0

類名:ClassComboPooledDataSource  implementsPooledDataSource implements DataSource

使用:

1.      下載,引入jar文件:  c3p0-0.9.1.2.jar

2.      使用連接池,創建連接

a)        硬編碼方式

b)        配置方式(xml)

自動加載src下c3p0的配置文件【c3p0-config.xml】

  1. public class App {
  2.  
  3. @Test
  4. //1. 硬編碼方式,使用C3P0連接池管理連接
  5. public void testCode() throws Exception {
  6. // 創建連接池核心工具類
  7. ComboPooledDataSource dataSource = new ComboPooledDataSource();
  8. // 設置連接參數:url、驅動、用戶密碼、初始連接數、最大連接數
  9. dataSource.setJdbcUrl( "jdbc:mysql://localhost:3306/jdbc_demo");
  10. dataSource.setDriverClass( "com.mysql.jdbc.Driver");
  11. dataSource.setUser( "root");
  12. dataSource.setPassword( "root");
  13. dataSource.setInitialPoolSize( 3);
  14. dataSource.setMaxPoolSize( 6);
  15. dataSource.setMaxIdleTime( 1000);
  16.  
  17. // ---> 從連接池對象中,獲取連接對象
  18. Connection con = dataSource.getConnection();
  19. // 執行更新
  20. con.prepareStatement( "delete from admin where id=7").executeUpdate();
  21. // 關閉
  22. con.close();
  23. }
  24.  
  25. @Test
  26. //2. XML配置方式,使用C3P0連接池管理連接
  27. public void testXML() throws Exception {
  28. // 創建c3p0連接池核心工具類
  29. // 自動加載src下c3p0的配置文件【c3p0-config.xml】
  30. ComboPooledDataSource dataSource = new ComboPooledDataSource();// 使用默認的配置
  31.  
  32. // 獲取連接
  33. Connection con = dataSource.getConnection();
  34. // 執行更新
  35. con.prepareStatement( "delete from admin where id=5").executeUpdate();
  36. // 關閉
  37. con.close();
  38.  
  39. }
  40. }

 

總結:

DataSource 接口是 JDBC 2.0 API 中的新增內容,它提供了連接到數據源的另一種方法。使用 DataSource 對象是連接到數據源的首選方法。

 

DataSource比DriverManager好在哪里呢?

1. DataSource創建的connection既有基本實現,也有連接池實現(可以復用,DataSource幫我們實現了復用機制),而DriverManager創建的connection則不能復用(當然自己寫連接池,自己來實現復用機制也是可以的,可以參考:使用動態代理實現自定義連接池)。所以sun公司規定連接池技術需要實現DataSource接口。

2. DataSource中封裝了DriverManager的使用,使用DataSource的一個好處是可以在外邊配置(如C3P0直接修改xml文件,不用自己寫配置文件db.properties)。

3. 配置DataSource,由容器來獲取Connection並結合連接池的應用比直接使用DriverManager操作JDBC效率高一些(參考:DBCP vs DriverManage效率)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM