Druid C3P0連接池的使用 和DBUtils的使用 以及事務(wù)

01 Druid 連接池

1.手動設(shè)置參數(shù)的方法
@Test
// 手動設(shè)置參數(shù)的方法:
public void demo1(){
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql:///day04");
    dataSource.setUsername("root");
    dataSource.setPassword("123");
    try{
        // 獲得連接:
        conn = dataSource.getConnection();
        // 編寫SQL:
        String sql = "select * from account";
        pstmt = conn.prepareStatement(sql);
        // 執(zhí)行sql:
        rs = pstmt.executeQuery();
        while(rs.next()){
            System.out.println(rs.getInt("id")+"   "+rs.getString("name")+"   "+rs.getDouble("money"));
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(rs, pstmt, conn);
    }
    
}
2.使用配置文件 .properties 文件使用Properties 類來處理 
@Test 
public void demo2(){
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    try{
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        // 獲得連接:
        conn = dataSource.getConnection();
        // 編寫SQL:
        String sql = "select * from account";
        pstmt = conn.prepareStatement(sql);
        // 執(zhí)行sql:
        rs = pstmt.executeQuery();
        while(rs.next()){
            System.out.println(rs.getInt("id")+"   "+rs.getString("name")+"   "+rs.getDouble("money"));
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(rs, pstmt, conn);
    }
}

02 C3P0連接池

1.手動設(shè)置鏈接代碼  
@Test
// 手動設(shè)置參數(shù)的方法:
public void demo1(){
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    try{
        // 核心類:
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        // 手動設(shè)置參數(shù):
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql:///day04");
        dataSource.setUser("root");
        dataSource.setPassword("123");
        // 獲得連接:
        conn = dataSource.getConnection();
        // 編寫SQL:
        String sql = "select * from account";
        pstmt = conn.prepareStatement(sql);
        // 執(zhí)行sql:
        rs = pstmt.executeQuery();
        while(rs.next()){
            System.out.println(rs.getInt("id")+"   "+rs.getString("name")+"   "+rs.getDouble("money"));
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(rs, pstmt, conn);
    }
    
}

2.使用配置文件添加
@Test
// 配置文件的方式
public void demo2(){
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    try{
        // 核心類:
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        // 獲得連接:
        conn = dataSource.getConnection();
        // 編寫SQL:
        String sql = "select * from account";
        pstmt = conn.prepareStatement(sql);
        // 執(zhí)行sql:
        rs = pstmt.executeQuery();
        while(rs.next()){
            System.out.println(rs.getInt("id")+"   "+rs.getString("name")+"   "+rs.getDouble("money"));
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(rs, pstmt, conn);
    }
    
}

03 DBUtils 使用

查看核心API:
    QueryRunner     :核心執(zhí)行類
    ResultSetHandler    :提供對查詢結(jié)果封裝
    DbUtils         :工具類

    @Test
 簡單使用DBUils
    public void demo1() throws SQLException{
        QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
        String sql = "insert into account values (null,?,?)";
        queryRunner.update(sql, "劉如花",10000);
    
    }

1.添加
@Test
// 保存操作
public void demo1() throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql ="insert into account values (null,?,?)";
    queryRunner.update(sql, "aaa",10000);
}
2.修改
@Test
// 修改操作
public void demo2() throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql ="update account set name=?,money=? where id =?";
    queryRunner.update(sql, "bbb",20000,4);
}
3.刪除
@Test
// 刪除操作
public void demo3() throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql ="delete from account where id =?";
    queryRunner.update(sql, 4);
}
4.查詢
ArrayHandler:
@Test
// ArrayHandler:將查詢到的一條記錄封裝到數(shù)組當(dāng)中
public void demo1() throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql  = "select * from account where id = ?";
    Object[] objs = queryRunner.query(sql, new ArrayHandler(), 1);
    System.out.println(Arrays.toString(objs));
}
ArrayListHandler:
將多條記錄進(jìn)行封裝,一條記錄封裝成一個(gè)數(shù)組拗踢,多條記錄封裝成一個(gè)裝有數(shù)組的集合
@Test
// ArrayListHandler:?   將多條記錄進(jìn)行封裝母市,一條記錄封裝成一個(gè)數(shù)組桐腌,多條記錄封裝成一個(gè)裝有數(shù)組的集合
public void demo2() throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select * from account";
    List<Object[]> list = queryRunner.query(sql, new ArrayListHandler());
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }
}
BeanHandler
將一條記錄封裝到一個(gè)JavaBean中
JavaBean就是滿足了一定格式的Java類 屬性私有化
提供無參數(shù)的構(gòu)造
對私有屬性提供public的get和set方法
@Test
// BeanHandler:將一條記錄封裝到一個(gè)javaBean中的
public void demo3()throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select * from account where id = ?";
    Account account = queryRunner.query(sql, new BeanHandler<>(Account.class), 1);
    System.out.println(account);
}   
BeanListHandler
將多條記錄封裝到一個(gè)裝有JavaBean的List集合中
@Test
// BeanListHandler:將多條記錄封裝到一個(gè)裝有JavaBean的List集合中
public void demo4()throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select * from account";
    List<Account> list = queryRunner.query(sql, new BeanListHandler<>(Account.class));
    for (Account account : list) {
        System.out.println(account);
    }
}
MapHandler
將一條記錄封裝成一個(gè)Map集合蝌戒,Map的key是字段名稱设凹,Map的value是字段的值贸街。
@Test
// MapHandler:封裝一條記錄到Map中
public void demo5()throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select * from account where id = ?";
    Map<String,Object> map = queryRunner.query(sql, new MapHandler() ,2);
    System.out.println(map);
}
MapListHandler
將多條記錄進(jìn)行封裝庵寞,一條記錄封裝成一個(gè)Map,多條記錄封裝成一個(gè)裝有Map的List集合中
@Test
// MapListHandler:
public void demo6()throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select * from account";
    List<Map<String,Object>> list = queryRunner.query(sql, new MapListHandler());
    for (Map<String, Object> map : list) {
        System.out.println(map);
    }
}
ColumnListHandler
@Test
// ColumnListHandler
public void demo7()throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select name from account";
    List<Object> list  = queryRunner.query(sql, new ColumnListHandler());
    for (Object object : list) {
        System.out.println(object);
    }
}
ScalarHandler
@Test
//ScalarHandler:單值查詢
public void demo8()throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select count(*) from account";
    Long count = (Long) queryRunner.query(sql, new ScalarHandler());
    System.out.println(count);
}
KeyedHandler
@Test
// KeyedHandler:
public void demo9()throws SQLException{
    QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
    String sql = "select * from account";
    Map<Object,Map<String,Object>> map= queryRunner.query(sql, new KeyedHandler("name"));
    for (Object key : map.keySet()) {
        System.out.println(key + "   "+map.get(key));
    }
}

04 JDBC的事務(wù)管理

在Connection對象中有對事務(wù)管理操作的一組API:
setAutoCommit(boolean flag);
commit();
rollback();
事務(wù)管理:
@Test
// 基本轉(zhuǎn)賬環(huán)境
public void demo1(){
    Connection conn = null;
    PreparedStatement pstmt = null;
    try{
        // 獲得連接:
        conn = JDBCUtils.getConnection();

        ###QΨ恕捐川!// 開啟事務(wù):(***重點(diǎn)***)
        conn.setAutoCommit(false);

        // 編寫SQL:
        String sql = "update account set money = money + ? where name = ?";
        // 預(yù)編譯SQL:
        pstmt = conn.prepareStatement(sql);
        // 設(shè)置參數(shù):
        // 扣除劉立 1000 
        pstmt.setDouble(1, -1000);
        pstmt.setString(2, "劉立");
        pstmt.executeUpdate(); // 扣錢
        
        int d = 1 / 0;
        
        // 給鳳姐加 1000
        pstmt.setDouble(1, 1000);
        pstmt.setString(2, "鳳姐");
        pstmt.executeUpdate(); // 加錢
        
        ###!逸尖!// 提交事務(wù):(***重點(diǎn)***)
        conn.commit();
    }catch(Exception e){
        ###9帕ぁ瘸右!// 回滾事務(wù):(***重點(diǎn)***)
        try {
            conn.rollback();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        e.printStackTrace();
    }finally{
        // 釋放資源:
        JDBCUtils.release(pstmt, conn);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市岩齿,隨后出現(xiàn)的幾起案子太颤,更是在濱河造成了極大的恐慌,老刑警劉巖盹沈,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龄章,死亡現(xiàn)場離奇詭異,居然都是意外死亡乞封,警方通過查閱死者的電腦和手機(jī)做裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肃晚,“玉大人锚贱,你說我怎么就攤上這事∠菥荆” “怎么了惋鸥?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悍缠。 經(jīng)常有香客問我卦绣,道長,這世上最難降的妖魔是什么飞蚓? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任滤港,我火速辦了婚禮,結(jié)果婚禮上趴拧,老公的妹妹穿的比我還像新娘溅漾。我一直安慰自己,他們只是感情好著榴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布添履。 她就那樣靜靜地躺著,像睡著了一般脑又。 火紅的嫁衣襯著肌膚如雪暮胧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天问麸,我揣著相機(jī)與錄音往衷,去河邊找鬼。 笑死严卖,一個(gè)胖子當(dāng)著我的面吹牛席舍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哮笆,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼来颤,長吁一口氣:“原來是場噩夢啊……” “哼汰扭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脚曾,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤东且,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后本讥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珊泳,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年拷沸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了色查。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撞芍,死狀恐怖秧了,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情序无,我是刑警寧澤验毡,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站帝嗡,受9級特大地震影響晶通,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哟玷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一狮辽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巢寡,春花似錦喉脖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谦絮,卻和暖如春菱皆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挨稿。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留京痢,地道東北人奶甘。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像祭椰,于是被迫代替她去往敵國和親臭家。 傳聞我的和親對象是個(gè)殘疾皇子疲陕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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

  • 本文包括傳統(tǒng)JDBC的缺點(diǎn)連接池原理自定義連接池開源數(shù)據(jù)庫連接池DBCP連接池C3P0連接池Tomcat內(nèi)置連接池...
    廖少少閱讀 16,749評論 0 37
  • 5.Spring的事務(wù) 通常情況下,J2EE有2種事務(wù)管理方式:全局事務(wù)和本地事務(wù)钉赁,2種事務(wù)都比較明顯的缺陷蹄殃。 全...
    FTOLsXD閱讀 1,508評論 0 8
  • 最原始的數(shù)據(jù)庫連接就是我們打開一個(gè)連接,使用過后再關(guān)閉該鏈接來釋放資源你踩。頻繁的新建打開再關(guān)閉連接對jvm和數(shù)據(jù)庫都...
    野柳閱讀 6,365評論 1 11
  • 1.連接池思想 為什么必須使用數(shù)據(jù)庫連接池: 普通的JDBC數(shù)據(jù)庫連接(Connectiond對象)使用 Driv...
    賈里閱讀 871評論 0 0
  • 場景:UIViewController 上添加 UITableView 以下主要講的是通過storyboard上直...
    Minoz_min閱讀 1,348評論 1 0