<轉(zhuǎn)>JDBC連接數(shù)據(jù)庫的四種方式:DriverManager,DataSource,DBCP,C3P0

《轉(zhuǎn)》

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

驅(qū)動管理器類梅誓,用于管理所有注冊的驅(qū)動程序。

(注:DataSource 接口是 JDBC 2.0 API 中的新增內(nèi)容户敬,它提供了連接到數(shù)據(jù)源的另一種方法蚊丐。使用 DataSource 對象是連接到數(shù)據(jù)源的首選方法。)

常用的兩個API

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

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

@Test   public void test1(){        Statement stmt = null;      Connection conn = null;     try {           //1.驅(qū)動注冊程序  --內(nèi)部執(zhí)行了RegisterDriver           Class.forName("com.mysql.jdbc.Driver");                     //2.獲取連接對象          conn = DriverManager.getConnection(url, user, password);                        //3.創(chuàng)建Statement         stmt = conn.createStatement();                      //4.準備sql           String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),gender VARCHAR(2))";                      //5.發(fā)送sql語句析命,執(zhí)行sql語句,得到返回結(jié)果          int count = stmt.executeUpdate(sql);                        //6.輸出          System.out.println("影響了"+count+"行主卫!");       } catch (Exception e) {         e.printStackTrace();            throw new RuntimeException(e);      } finally{          //7.關(guān)閉連接(順序:后打開的先關(guān)閉)            if(stmt!=null)              try {                   stmt.close();               } catch (SQLException e) {                  e.printStackTrace();                    throw new RuntimeException(e);              }           if(conn!=null)              try {                   conn.close();               } catch (SQLException e) {                  e.printStackTrace();                    throw new RuntimeException(e);              }       }   }

方法2:使用實現(xiàn)了javax.sql.DataSource接口的子類

javax.sql.DataSource接口

包名:javax.sql

接口名: DataSource

作為 DriverManager 工具的替代項,DataSource 對象是獲取連接的首選方法鹃愤。DataSource接口由驅(qū)動程序供應(yīng)商實現(xiàn)簇搅。共有三種類型的實現(xiàn):

1. 基本實現(xiàn) - 生成標(biāo)準的 Connection 對象

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

3. 分布式事務(wù)實現(xiàn) - 生成一個 Connection 對象瘩将,該對象可用于分布式事務(wù),大多數(shù)情況下總是參與連接池凹耙。此實現(xiàn)與中間層事務(wù)管理器一起使用姿现,大多數(shù)情況下總是與連接池管理器一起使用。

自己實現(xiàn)DataSource子類這種方法不常用肖抱,常用的方法可以參考方法3和方法4

插入一句:Sun公司約定:如果是連接池技術(shù)备典,都需要實現(xiàn)javax.sql.DataSource接口

方法3:DBCP連接池

DBCP 是 Apache 軟件基金組織下的開源連接池實現(xiàn),使用DBCP數(shù)據(jù)源意述,應(yīng)用程序應(yīng)在系統(tǒng)中增加如下兩個 jar 文件:

Commons-dbcp.jar:連接池的實現(xiàn)

Commons-pool.jar:連接池實現(xiàn)的依賴庫

Tomcat 的連接池正是采用該連接池來實現(xiàn)的熊经。該數(shù)據(jù)庫連接池既可以與應(yīng)用服務(wù)器整合使用,也可由應(yīng)用程序獨立使用欲险。

核心類: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. 兩種方式實現(xiàn)連接池

1)硬編碼方式

2)配置方式

public class App_DBCP {     // 1\. 硬編碼方式實現(xiàn)連接池   @Test   public void testDbcp() throws Exception {       // DBCP連接池核心類       BasicDataSource dataSouce = new BasicDataSource();      // 連接池參數(shù)配置:初始化連接數(shù)、最大連接數(shù) / 連接字符串匹涮、驅(qū)動天试、用戶、密碼        dataSouce.setUrl("jdbc:mysql:///jdbc_demo");        //數(shù)據(jù)庫連接字符串      dataSouce.setDriverClassName("com.mysql.jdbc.Driver");  //數(shù)據(jù)庫驅(qū)動     dataSouce.setUsername("root");                          //數(shù)據(jù)庫連接用戶       dataSouce.setPassword("root");                          //數(shù)據(jù)庫連接密碼       dataSouce.setInitialSize(3);  // 初始化連接      dataSouce.setMaxActive(6);    // 最大連接       // 獲取連接     Connection con = dataSouce.getConnection();     con.prepareStatement("delete from admin where id=3").executeUpdate();       // 關(guān)閉       con.close();    }       @Test   // 2\. 【推薦】配置方式實現(xiàn)連接池,  便于維護 public void testProp() throws Exception {       // 加載prop配置文件       Properties prop = new Properties();     // 獲取文件流        InputStream inStream = App_DBCP.class.getResourceAsStream("db.properties");     // 加載屬性配置文件     prop.load(inStream);        // 根據(jù)prop配置然低,直接創(chuàng)建數(shù)據(jù)源對象       DataSource dataSouce = BasicDataSourceFactory.createDataSource(prop);               // 獲取連接     Connection con = dataSouce.getConnection();     con.prepareStatement("delete from admin where id=4").executeUpdate();       // 關(guān)閉       con.close();    }}

|

配置方式實現(xiàn)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連接池:

     最常用的連接池技術(shù)!Spring框架雳攘,默認支持C3P0連接池技術(shù)带兜!

C3P0連接池,核心類:

CombopooledDataSource ds;

包名:com.mchange.v2.c3p0

類名:ClassComboPooledDataSource implementsPooledDataSource implements DataSource

使用:

  1.  下載吨灭,引入jar文件:  c3p0-0.9.1.2.jar
    
  2.  使用連接池刚照,創(chuàng)建連接
    

a) 硬編碼方式

b) 配置方式(xml)

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

public class App {  @Test   //1\. 硬編碼方式,使用C3P0連接池管理連接   public void testCode() throws Exception {       // 創(chuàng)建連接池核心工具類       ComboPooledDataSource dataSource = new ComboPooledDataSource();     // 設(shè)置連接參數(shù):url喧兄、驅(qū)動无畔、用戶密碼、初始連接數(shù)吠冤、最大連接數(shù)       dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc_demo");     dataSource.setDriverClass("com.mysql.jdbc.Driver");     dataSource.setUser("root");     dataSource.setPassword("root");     dataSource.setInitialPoolSize(3);       dataSource.setMaxPoolSize(6);       dataSource.setMaxIdleTime(1000);                // ---> 從連接池對象中浑彰,獲取連接對象      Connection con = dataSource.getConnection();        // 執(zhí)行更新     con.prepareStatement("delete from admin where id=7").executeUpdate();       // 關(guān)閉       con.close();    }       @Test   //2\. XML配置方式,使用C3P0連接池管理連接 public void testXML() throws Exception {        // 創(chuàng)建c3p0連接池核心工具類       // 自動加載src下c3p0的配置文件【c3p0-config.xml】       ComboPooledDataSource dataSource = new ComboPooledDataSource();// 使用默認的配置               //

</article>

</main>

    // 獲取連接
    Connection con = dataSource.getConnection();
    // 執(zhí)行更新
    con.prepareStatement("delete from admin where id=5").executeUpdate();
    // 關(guān)閉
    con.close();
    
}

總結(jié):

DataSource 接口是 JDBC 2.0 API 中的新增內(nèi)容拯辙,它提供了連接到數(shù)據(jù)源的另一種方法郭变。使用 DataSource 對象是連接到數(shù)據(jù)源的首選方法。

DataSource比DriverManager好在哪里呢?

1. DataSource創(chuàng)建的connection既有基本實現(xiàn)诉濒,也有連接池實現(xiàn)(可以復(fù)用周伦,DataSource幫我們實現(xiàn)了復(fù)用機制),而DriverManager創(chuàng)建的connection則不能復(fù)用(當(dāng)然自己寫連接池循诉,自己來實現(xiàn)復(fù)用機制也是可以的横辆,可以參考:使用動態(tài)代理實現(xiàn)自定義連接池)。所以sun公司規(guī)定連接池技術(shù)需要實現(xiàn)DataSource接口茄猫。

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勇劣,一起剝皮案震驚了整個濱河市靖避,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌比默,老刑警劉巖幻捏,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異命咐,居然都是意外死亡篡九,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門醋奠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榛臼,“玉大人,你說我怎么就攤上這事窜司∨嫔疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵塞祈,是天一觀的道長金刁。 經(jīng)常有香客問我,道長议薪,這世上最難降的妖魔是什么胀葱? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮笙蒙,結(jié)果婚禮上抵屿,老公的妹妹穿的比我還像新娘。我一直安慰自己捅位,他們只是感情好轧葛,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布搂抒。 她就那樣靜靜地躺著,像睡著了一般尿扯。 火紅的嫁衣襯著肌膚如雪求晶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天衷笋,我揣著相機與錄音芳杏,去河邊找鬼。 笑死辟宗,一個胖子當(dāng)著我的面吹牛爵赵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泊脐,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼空幻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了容客?” 一聲冷哼從身側(cè)響起秕铛,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缩挑,沒想到半個月后但两,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡供置,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年谨湘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士袄。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谎僻,靈堂內(nèi)的尸體忽然破棺而出娄柳,到底是詐尸還是另有隱情,我是刑警寧澤艘绍,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布赤拒,位于F島的核電站,受9級特大地震影響诱鞠,放射性物質(zhì)發(fā)生泄漏挎挖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一航夺、第九天 我趴在偏房一處隱蔽的房頂上張望蕉朵。 院中可真熱鬧,春花似錦阳掐、人聲如沸始衅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汛闸。三九已至蝙茶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诸老,已是汗流浹背隆夯。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留别伏,地道東北人蹄衷。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像畸肆,于是被迫代替她去往敵國和親宦芦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容