Java JDBC | 四種連接數據庫的方法

四種連接數據庫的方法(DriverManager、DataSource子類、DBCP、c3p0)   

〇、連接步驟

//第一步,註冊驅動程序
//com.MySQL.jdbc.Driver
Class.forName("數據庫驅動的完整類名");

//第二步,獲取一個數據庫的連接
Connection conn = DriverManager.getConnection("連接URL","用戶名","密碼");

//第三步,創建一個會話
Statement stmt=conn.createStatement();

//第四步,執行SQL語句,增加,刪除,修改記錄
stmt.executeUpdate("增加,刪除,修改記錄的SQL語句");

//或者查詢記錄
ResultSet rs = stmt.executeQuery("查詢記錄的SQL語句");

//第五步,對查詢的結果進行處理
while(rs.next()){
//對記錄的操作
}

//第六步,關閉連接
rs.close();
stmt.close();
conn.close();


一、環境 
  1、數據庫驅動jar文件    

  2、DBCP方法 
        Commons-dbcp.jar:連接池的實現 Commons-pool.jar:連接池實現的依賴庫 資源文件 
  3、c3p0方法: c3p0-0.9.1.2.jar 
        配置文件:c3p0-config.xml 

二、連接操作 

1、DriverManager方法

package demo.jdbcpool.test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
 private static String driverClass = "com.mysql.jdbc.Driver";
 private static String url = "jdbc:mysql://localhost:3306/test";
 private static String username = "root";
 private static String password = "123456";
 private static Connection conn = null;
 static {
  try {
   // 註冊驅動
   // 不要把conn = DriverManager.getConnection(url, username, password);
   // 放在這裏。防止所有用戶都用一個Connection
   Class.forName(driverClass);
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
 public static Connection getConnection() throws SQLException {
  conn = DriverManager.getConnection(url, username, password);
  return conn;
 }
}

2、使用DataSource子類方法;

資源文件 DBConnection.properties

driverClass = com.mysql.jdbc.Driver    
url = jdbc:mysql://localhost:3306/test  
username = root    
password = 123456
模擬數據連接池 
DataSourcePool.java  
package cn.langzi.jdbc.DataSource; 
import java.io.InputStream;       
import java.io.PrintWriter; 
import java.lang.reflect.InvocationHandler;        
import java.lang.reflect.Method;        
import java.lang.reflect.Proxy;        
import java.sql.Connection;        
import java.sql.DriverManager;        
import java.sql.SQLException;        
import java.util.LinkedList;        
import java.util.Properties;        
import javax.sql.DataSource;        
import javax.sql.DataSource; 
 public class DataSourcePool implements DataSource { 
    private static String url = null;         
    private static String username = null;        
    private static String password = null;     
    private static int size = 10;     
    private static LinkedList<Connection> list = new LinkedList<Connection>();         
static{
    try {                 
      InputStream in = DataSourcePool.class.getClassLoader()                       
          .getResourceAsStream       ("cn/langzi/jdbc/DataSource/DBConnection.properties");              
     Properties prop = new Properties();                   
     prop.load(in);                
     Class.forName(prop.getProperty("driverClass"));                 
     url = prop.getProperty("url");                 
     username = prop.getProperty("username");                 
     password = prop.getProperty("password");                
       } catch (Exception e) {                    
        throw new ExceptionInInitializerError(e);                  }         }         
       private static DataSourcePool pool = new DataSourcePool();            
       //創建對象就初始化size個數據庫連接        
       private DataSourcePool(){             
            for(int i=0;i<size;i++){
                  try {                   
                   Connection conn = DriverManager.getConnection(url, username, password);                   
                    System.out.println(conn);                         
                     list.add(conn);                   
                      } catch (SQLException e) {                              
                           e.printStackTrace();
                        } 
}

DataSource有兩種實現方式

1.直連數據庫方式 
當調用DataSource.getConnection()時,其實它調用的是DriverManager.getConnection(url, user, password)來獲取一個Connection,Connection使用完後被close,斷開與數據庫的連接,我們稱這總方式是直連數據庫,因爲每次都需要重新建立與數據庫之間的連接,而並沒有把之前的Connection保留供下次使用.

2.池化連接方式 
可以說這種方式就是使用了連接池技術.DataSource內部封裝了一個連接池,當你獲取DataSource的時候,它已經敲敲的與數據庫建立了多個Connection,並將這些Connection放入了連接池,此時調用DataSource.getConnection()它從連接池裏取一個Connection返回,Connection使用完後被close,但這個close並不是真正的與數據庫斷開連接,而是告訴連接池"我"已經被使用完,"你"可以把我分配給其它"人"使用了.就這樣連接池裏的Connection被循環利用,避免了每次獲取Connection時重新去連接數據庫.
對DataSource的兩種實現方式已經介紹完畢,現在知道DataSource與連接池之間的是關係而不是區別了吧,因爲DataSource與連接池根本就不是同一類型的東西,只有同一類型的東西才存在區別,例如:oracle與db2都是數據庫,它們才存在區別.我們這裏僅僅實現了數據庫的鏈接,並沒有池化鏈接

3、使用C3P0

ComboPooledDataSource cpds = new ComboPooledDataSource();  
  
// 加載數據庫驅動  
try {  
    cpds.setDriverClass("com.ibm.db2.jcc.DB2Driver");  
} catch (PropertyVetoException e1) {  
    e1.printStackTrace();  
}  
  
// 設置訪問數據庫的地址、用戶名和密碼  
cpds.setJdbcUrl("jdbc:db2://10.10.38.138:50000/malltest");  
cpds.setUser("db2inst1");  
cpds.setPassword("db2inst1");  
  
// 設置C3P0的一些配置,不設置則使用默認值  
cpds.setMinPoolSize(5);  
cpds.setAcquireIncrement(5);  
cpds.setMaxPoolSize(20);  
cpds.setMaxStatements(180);  
  
Connection conn = null;  
Statement stmt = null;  
ResultSet rs = null;  
try {  
    // 創建數據庫連接  
    conn = cpds.getConnection();  
      
    // 獲取數據庫操作對象  
    stmt = conn.createStatement();  
      
    // 操作數據庫獲取結果集  
    rs = stmt.executeQuery("select * from ly.t_merinf where merid='M0000178'");  
      
    // 處理結果集  
    while (rs.next()) {  
        System.out.println(rs.getString("mername"));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // 關閉結果集  
    if(rs != null) {  
        try { rs.close(); } catch (SQLException e) { }  
    }  
    // 關閉數據庫操作對象  
    if(stmt != null) {  
        try { stmt.close(); } catch (SQLException e) { }  
    }  
    // 關閉數據庫連接  
    if(conn != null) {  
        try { conn.close(); } catch (SQLException e) { }  
    }  
    try {  
        DataSources.destroy(cpds);  
    } catch (SQLException e) {  
        e.printStackTrace();  
    }  
}  

4、使用DBCP

配置文件:

driverClassName=com.ibm.db2.jcc.DB2Driver  
url=jdbc:db2://10.10.38.138:50000/malltest  
username=db2inst1  
password=db2inst1  
initialSize=3  
maxActive=5  
maxIdle=3  
minIdle=1  
maxWait=30000  
代碼:

// 1.創建連接池  
DataSource ds = null;  
try {  
    Properties prop = new Properties();  
    // 通過類路徑來加載屬性文件  
    prop.load(DbcpTest.class.getClassLoader().getResourceAsStream("database/dbcp/dbcp.properties"));  
    // 獲取數據源  
    ds = BasicDataSourceFactory.createDataSource(prop);  
} catch (IOException e) {  
    e.printStackTrace();  
} catch (Exception e) {  
    e.printStackTrace();  
}  
  
Connection conn = null;  
Statement stmt = null;  
ResultSet rs = null;  
try {  
    // 2.獲取數據庫連接  
    conn = ds.getConnection();  
      
    // 3.創建數據庫操作對象  
    stmt = conn.createStatement();  
      
    // 4.操作數據庫獲取結果集  
    rs = stmt.executeQuery("select * from ly.t_merinf where merid='M0000178'");  
  
    // 5.處理結果集  
    while (rs.next()) {  
        System.out.println(rs.getString("mername"));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // 關閉結果集  
    if(rs != null) {  
        try { rs.close(); } catch (SQLException e) { }  
    }  
    // 關閉數據庫操作對象  
    if(stmt != null) {  
        try { stmt.close(); } catch (SQLException e) { }  
    }  
    // 關閉數據庫連接  
    if(conn != null) {  
        try { conn.close(); } catch (SQLException e) { }  
    }  
}  





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章