Commons DbUtils 與 c3p0 結(jié)合使用

當(dāng)編寫一些小功能的的程序的時候荞胡,需要對數(shù)據(jù)庫進行操作,如果我們還使用spring + mybatis 的方式來訪問數(shù)據(jù)庫的話砰盐,會顯得略微龐大肿仑,這時可以使用Commons DbUtils 與 c3p0 結(jié)合,輕量小巧腥泥,很適合小項目開發(fā)匾南。

簡介

commons-dbutils是Apache組織提供的一個開源JDBC工具類庫,它是對JDBC的簡單封裝蛔外,學(xué)習(xí)成本極低蛆楞,并且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程序的性能夹厌。

c3p0數(shù)據(jù)庫連接池配置文件

在項目的src或resource目錄下加入c3p0-config.xml 配置文件豹爹,配置如下

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <default-config> 33 
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">dre@mtech1012</property>
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>

數(shù)據(jù)庫鏈接工具

獲取c3p0鏈接池工具,并使用ThreadLocal來實現(xiàn)事務(wù)尊流。

public class JdbcUtils {

    // 餓漢式
    private static DataSource ds = new ComboPooledDataSource();

    /**
     * 它為null表示沒有事務(wù)
     * 它不為null表示有事務(wù)
     * 當(dāng)開啟事務(wù)時帅戒,需要給它賦值
     * 當(dāng)結(jié)束事務(wù)時,需要給它賦值為null
     * 并且在開啟事務(wù)時崖技,讓dao的多個方法共享這個Connection
     */
    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    public static DataSource getDataSource() {
        return ds;
    }
    
    // 如果不把c3p0配置文件放在src或resource下的話逻住,就使用如下方式加載
//    static {
//        try {
//            Properties prop = new Properties();
//            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
//            prop.load(in);
//            BasicDataSourceFactory factory = new BasicDataSourceFactory();
//            ds = factory.createDataSource(prop);
//        } catch (Exception e) {
//            throw new ExceptionInInitializerError(e);
//        }
//    }

    /**
     * dao使用本方法來獲取連接
     */
    public static Connection getConnection() throws SQLException {
        /*
         * 如果有事務(wù),返回當(dāng)前事務(wù)的con
         * 如果沒有事務(wù)迎献,通過連接池返回新的con
         */
        Connection con = tl.get();//獲取當(dāng)前線程的事務(wù)連接
        if (con != null) return con;
        return ds.getConnection();
    }

    /**
     * 開啟事務(wù)
     */
    public static void beginTransaction() throws SQLException {
        Connection con = tl.get();//獲取當(dāng)前線程的事務(wù)連接
        if (con != null) throw new SQLException("已經(jīng)開啟了事務(wù)瞎访,不能重復(fù)開啟!");
        con = ds.getConnection();//給con賦值吁恍,表示開啟了事務(wù)
        con.setAutoCommit(false);//設(shè)置為手動提交
        tl.set(con);//把當(dāng)前事務(wù)連接放到tl中
    }

    /**
     * 提交事務(wù)
     */
    public static void commitTransaction() throws SQLException {
        Connection con = tl.get();//獲取當(dāng)前線程的事務(wù)連接
        if (con == null) throw new SQLException("沒有事務(wù)不能提交扒秸!");
        con.commit();//提交事務(wù)
        con.close();//關(guān)閉連接
        con = null;//表示事務(wù)結(jié)束播演!
        tl.remove();
    }

    /**
     * 回滾事務(wù)
     */
    public static void rollbackTransaction() throws SQLException {
        Connection con = tl.get();//獲取當(dāng)前線程的事務(wù)連接
        if (con == null) throw new SQLException("沒有事務(wù)不能回滾!");
        con.rollback();
        con.close();
        con = null;
        tl.remove();
    }

    /**
     * 釋放Connection
     */
    public static void releaseConnection(Connection connection) throws SQLException {
        Connection con = tl.get();//獲取當(dāng)前線程的事務(wù)連接
        if (connection != con) {//如果參數(shù)連接伴奥,與當(dāng)前事務(wù)連接不同写烤,說明這個連接不是當(dāng)前事務(wù),可以關(guān)閉拾徙!
            if (connection != null && !connection.isClosed()) {//如果參數(shù)連接沒有關(guān)閉洲炊,關(guān)閉之!
                connection.close();
            }
        }
    }
}

dbutils 中的 CRUD

public class Demo {    
    
    @Test
    public void insert() throws SQLException {
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
        Object[] params = {2, "bbb", "123", "bbb@163.com", new Date()};
        runner.update(sql, params);
    }

    @Test
    public void update() throws SQLException {
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "update users set email=? where id=?";
        Object[] params = {"yeyiyi@126.com", 1};
        runner.update(sql, params);
    }

    @Test
    public void delete() throws SQLException {
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "delete from users where id=?";
        runner.update(sql, 2);
    }

    @Test
    public void find() throws SQLException {
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from users where id=?";
        User user = (User) runner.query(sql, 1, new BeanHandler(User.class));
        System.out.println(user.getEmail());
    }

    @Test
    public void getAll() throws SQLException {
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from users";
        List list = (List) runner.query(sql, new BeanListHandler(User.class));
        System.out.println(list);
    }

    @Test
    public void batch() throws SQLException {
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
        Object[][] params = new Object[3][5];
        for (int i = 0; i < params.length; i++) {
            params[i] = new Object[]{i+1, "aa"+i, "123", i+"@sian.com", new Date()};
        }
        runner.batch(sql, params);
    }
}

查詢結(jié)果的封裝

  • ArrayHandler:把結(jié)果集中的第一行數(shù)據(jù)轉(zhuǎn)成對象數(shù)組尼啡。
  • ArrayListHandler:把結(jié)果集中的每一行數(shù)據(jù)都轉(zhuǎn)成一個數(shù)組暂衡,再存放到List中。
  • BeanHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個對應(yīng)的JavaBean實例中崖瞭。
  • BeanListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個對應(yīng)的JavaBean實例中狂巢,存放到List里。
  • ColumnListHandler:將結(jié)果集中某一列的數(shù)據(jù)存放到List中书聚。
  • KeyedHandler(name):將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個Map里唧领,再把這些map再存到一個map里,其key為指定的key寺惫。
  • MapHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個Map里疹吃,key是列名,value就是對應(yīng)的值西雀。
  • MapListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個Map里,然后再存放到List歉摧。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艇肴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叁温,更是在濱河造成了極大的恐慌再悼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膝但,死亡現(xiàn)場離奇詭異冲九,居然都是意外死亡,警方通過查閱死者的電腦和手機跟束,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門莺奸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冀宴,你說我怎么就攤上這事灭贷。” “怎么了略贮?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵甚疟,是天一觀的道長仗岖。 經(jīng)常有香客問我,道長览妖,這世上最難降的妖魔是什么轧拄? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮讽膏,結(jié)果婚禮上檩电,老公的妹妹穿的比我還像新娘。我一直安慰自己桅打,他們只是感情好是嗜,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挺尾,像睡著了一般鹅搪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遭铺,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天丽柿,我揣著相機與錄音,去河邊找鬼魂挂。 笑死甫题,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涂召。 我是一名探鬼主播坠非,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼果正!你這毒婦竟也來了炎码?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤秋泳,失蹤者是張志新(化名)和其女友劉穎潦闲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫皱,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡歉闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卓起。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片和敬。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖既绩,靈堂內(nèi)的尸體忽然破棺而出概龄,到底是詐尸還是另有隱情,我是刑警寧澤饲握,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布私杜,位于F島的核電站蚕键,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衰粹。R本人自食惡果不足惜锣光,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铝耻。 院中可真熱鬧誊爹,春花似錦、人聲如沸瓢捉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泡态。三九已至搂漠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間某弦,已是汗流浹背桐汤。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留靶壮,地道東北人怔毛。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像腾降,于是被迫代替她去往敵國和親拣度。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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

  • 本文包括:1螃壤、DBUtils簡介2蜡娶、DbUtils類3、QueryRunner類4映穗、ResultSetHandle...
    廖少少閱讀 20,605評論 1 24
  • JDBC框架——DBUtils 本文包括: 1、DBUtils簡介 2幕随、DbUtils類 3蚁滋、QueryRunne...
    加油小杜閱讀 874評論 0 1
  • JDBC概述 在Java中,數(shù)據(jù)庫存取技術(shù)可分為如下幾類:JDBC直接訪問數(shù)據(jù)庫赘淮、JDO技術(shù)辕录、第三方O/R工具,如...
    usopp閱讀 3,533評論 3 75
  • MySQL遠程登錄 MySQL MAC5.7.17及以上版本中文顯示亂碼問題 若編碼信息如圖梢卸,則無需設(shè)置走诞。若dat...
    PengFly閱讀 762評論 0 0
  • 對于昨天和明天我都沒有太大的觸動,我是一個連今天都會忘記的人蛤高,我的思維總是會停留在特定的某一點蚣旱,又或許可以說碑幅,我...
    昕曦閱讀 202評論 0 1