JavaWeb基础—dbutils的简单入门
簡(jiǎn)明入門(mén)教程,參考:https://www.cnblogs.com/CQY1183344265/p/5854418.html
進(jìn)行此章節(jié)之前,介紹一個(gè)JdbcUtils的再次的簡(jiǎn)單封裝
(例如后面需要構(gòu)造QueryRunner時(shí)得到數(shù)據(jù)源等的簡(jiǎn)便的操作)
package cn.itcast.jdbcutils;import java.sql.Connection; import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtils {//使用的是默認(rèn)的配置信息,注意給出c3p0-config.xml配置文件private static ComboPooledDataSource dataSource = new ComboPooledDataSource();//處理多線程的并發(fā)訪問(wèn)問(wèn)題,使用ThreadLocalprivate static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();public static Connection getConnection() throws SQLException{//不為Null說(shuō)明開(kāi)啟了事務(wù),返回連接//先獲取自己線程的ConnectionConnection con = tl.get();if(con != null) return con;return dataSource.getConnection();}/*** 大方一點(diǎn),給出連接池對(duì)象給你*/public static ComboPooledDataSource getDataSource(){return dataSource;}//給出三個(gè)方法/*** 開(kāi)啟事務(wù)* 創(chuàng)建一個(gè)Connection,設(shè)置為手動(dòng)提交* 保證DAO使用的就是這個(gè)事務(wù)的連接* 同時(shí)還需要保證下面兩個(gè)提交與回滾是同一個(gè)連接* 通過(guò)創(chuàng)建一個(gè)本類(lèi)的連接成員* @throws SQLException */public static void startTransaction() throws SQLException{Connection con = tl.get();//開(kāi)啟事務(wù)后con不再為nullcon = getConnection();con.setAutoCommit(false);//保存連接 tl.set(con);}/*** 提交事務(wù)* @throws SQLException */public static void commitTransaction() throws SQLException{Connection con = tl.get();if(con == null) throw new SQLException("事務(wù)未開(kāi)啟,請(qǐng)勿提交!");con.commit();con.close();//清空連接con = null;//移除事務(wù) tl.remove();}/*** 回滾事務(wù)* @throws SQLException */public static void rollbackTransaction() throws SQLException {Connection con = tl.get();if(con == null) throw new SQLException("事務(wù)未開(kāi)啟,請(qǐng)勿回滾!");con.rollback();con.close();con = null;tl.remove();}/*** 用于釋放連接* @param connection* @throws SQLException */public static void releaseConnection(Connection connection) throws SQLException{//事務(wù)專(zhuān)用則不關(guān)閉,后續(xù)會(huì)有關(guān)閉//如果不是事務(wù),則需要關(guān)閉Connection con = tl.get();//事務(wù)都沒(méi)有,直接關(guān)閉if(con == null) connection.close();//有事務(wù),判斷是否相等,是否為專(zhuān)用連接if(con != connection) connection.close();} }?
一、簡(jiǎn)易的入門(mén):
common-dbutils是Apache對(duì)Jdbc的一個(gè)簡(jiǎn)單的封裝,其中主要涉及的類(lèi)有:
QueryRunner
ResultSetHandler
DbUtils
使用的依賴(lài)如下:
?
1.
重要類(lèi) QueryRunner (構(gòu)造時(shí)提供數(shù)據(jù)源)
重要方法:int update(String sql,Object...params);增刪改
重載版本 int update(Connection con,String sql,Object...params);本方法不再管理con,由外部提供(保證是同一個(gè))
T query(String sql,ResultSetHandler rsh,Object...params);查詢(xún)
重載版本類(lèi)同上
給出一個(gè)使用的小例子:
package cn.itcast.demo;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner; import org.junit.Test;import cn.itcast.jdbcutils.JdbcUtils;/*** 測(cè)試commons-dbutils* @author jiangbei01**/ public class Demo02 {@Testpublic void testfun1() throws SQLException{QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());String sql = "INSERT INTO ab VALUES(?,?)";Object[] params = {8,"肖恩"};qr.update(sql, params);} }
?
2.
給一張表對(duì)應(yīng)一個(gè)類(lèi),字段與屬性對(duì)應(yīng)起來(lái)
他會(huì)先得到ResultSet,然后調(diào)用handler方法轉(zhuǎn)換成需要的類(lèi)型
接口ResultSetHandler,我們學(xué)習(xí)的實(shí)現(xiàn)類(lèi):
BeanHandler 構(gòu)造器需要一個(gè)class參數(shù),返回指定類(lèi)型的javabean對(duì)象 ?一行記錄
BeanListHandler 構(gòu)造器同上,由名稱(chēng)知為多行,轉(zhuǎn)換成list對(duì)象,多個(gè)javabean ?多行記錄
MapHandler 把一行記錄轉(zhuǎn)換成一個(gè)map (如{name:zhangsan,age:20}) ?一行記錄
MapListHandler 同上對(duì)比,多個(gè)map的多行記錄,返回List<Map>,返回的也是一個(gè)List ?多行記錄
ScalarHandler 單行單列,通常與select count(*) from stu; 單行單列
這里使用裝飾者模式加上開(kāi)頭改造的工具類(lèi),將QueryRunner稍加改造
package cn.itcast.jdbcutils;import java.sql.Connection; import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; /*** 這個(gè)類(lèi)可以自身自己處理連接問(wèn)題,可以通過(guò)jdbcUtils釋放連接(類(lèi)方法會(huì)處理是否關(guān)閉)* @author jiangbei01**/ public class TxQueryRunner extends QueryRunner {@Overridepublic int[] batch(String sql, Object[][] params) throws SQLException {/** 得到連接* 執(zhí)行父類(lèi)方法* 釋放連接* 返回值*/Connection con = JdbcUtils.getConnection();int[] results = super.batch(con,sql, params);JdbcUtils.releaseConnection(con);return results;}@Overridepublic <T> T query(String sql, Object param, ResultSetHandler<T> rsh) throws SQLException {/** 得到連接* 執(zhí)行父類(lèi)方法* 釋放連接* 返回值*/Connection con = JdbcUtils.getConnection();T results = super.query(con,sql, param,rsh);JdbcUtils.releaseConnection(con);return results;}@Overridepublic <T> T query(String sql, Object[] params, ResultSetHandler<T> rsh) throws SQLException {Connection con = JdbcUtils.getConnection();T results = super.query(con,sql, params,rsh);JdbcUtils.releaseConnection(con);return results;}@Overridepublic <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {Connection con = JdbcUtils.getConnection();T results = super.query(con,sql, rsh,params);JdbcUtils.releaseConnection(con);return results;}@Overridepublic <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {Connection con = JdbcUtils.getConnection();T results = super.query(con,sql, rsh);JdbcUtils.releaseConnection(con);return results;}@Overridepublic int update(String sql, Object... params) throws SQLException {Connection con = JdbcUtils.getConnection();int results = super.update(con,sql,params);JdbcUtils.releaseConnection(con);return results;}@Overridepublic int update(String sql, Object param) throws SQLException {Connection con = JdbcUtils.getConnection();int results = super.update(con,sql,param);JdbcUtils.releaseConnection(con);return results;}@Overridepublic int update(String sql) throws SQLException {Connection con = JdbcUtils.getConnection();int results = super.update(con,sql);JdbcUtils.releaseConnection(con);return results;}}
給出一個(gè)使用改造類(lèi)的小例子:
package cn.itcast.jdbcutils;import java.sql.Connection; import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;public class AccountDAO {/*** 不能使用連接池* 要自己提供連接才能保證是同一個(gè)連接* @param name* @param money* @throws SQLException*/public static void update(String name, double money) throws SQLException{QueryRunner qr = new TxQueryRunner();String sql = "update account set balaence=balaence+? where name=?";Object[] params = {money,name};//給出參數(shù)并執(zhí)行 qr.update(sql,params);/** 以下代碼新寫(xiě)的Tx類(lèi)已經(jīng)完成,無(wú)需處理* Connection con = JdbcUtils.getConnection();* //釋放連接JdbcUtils.releaseConnection(con);*/} }?
并發(fā)訪問(wèn)時(shí)產(chǎn)生的問(wèn)題,可以使用ThreadLocal類(lèi)(待更新詳細(xì))進(jìn)行解決,示例如下:
package cn.itcast.jdbcutils;import java.sql.Connection; import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtils {//使用的是默認(rèn)的配置信息,注意給出c3p0-config.xml配置文件private static ComboPooledDataSource dataSource = new ComboPooledDataSource();//處理多線程的并發(fā)訪問(wèn)問(wèn)題,使用ThreadLocalprivate static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();public static Connection getConnection() throws SQLException{//不為Null說(shuō)明開(kāi)啟了事務(wù),返回連接//先獲取自己線程的ConnectionConnection con = tl.get();if(con != null) return con;return dataSource.getConnection();}/*** 大方一點(diǎn),給出連接池對(duì)象給你*/public static ComboPooledDataSource getDataSource(){return dataSource;}//給出三個(gè)方法/*** 開(kāi)啟事務(wù)* 創(chuàng)建一個(gè)Connection,設(shè)置為手動(dòng)提交* 保證DAO使用的就是這個(gè)事務(wù)的連接* 同時(shí)還需要保證下面兩個(gè)提交與回滾是同一個(gè)連接* 通過(guò)創(chuàng)建一個(gè)本類(lèi)的連接成員* @throws SQLException */public static void startTransaction() throws SQLException{Connection con = tl.get();//開(kāi)啟事務(wù)后con不再為nullcon = getConnection();con.setAutoCommit(false);//保存連接 tl.set(con);}/*** 提交事務(wù)* @throws SQLException */public static void commitTransaction() throws SQLException{Connection con = tl.get();if(con == null) throw new SQLException("事務(wù)未開(kāi)啟,請(qǐng)勿提交!");con.commit();con.close();//清空連接con = null;//移除事務(wù) tl.remove();}/*** 回滾事務(wù)* @throws SQLException */public static void rollbackTransaction() throws SQLException {Connection con = tl.get();if(con == null) throw new SQLException("事務(wù)未開(kāi)啟,請(qǐng)勿回滾!");con.rollback();con.close();con = null;tl.remove();}/*** 用于釋放連接* @param connection* @throws SQLException */public static void releaseConnection(Connection connection) throws SQLException{//事務(wù)專(zhuān)用則不關(guān)閉,后續(xù)會(huì)有關(guān)閉//如果不是事務(wù),則需要關(guān)閉Connection con = tl.get();//事務(wù)都沒(méi)有,直接關(guān)閉if(con == null) connection.close();//有事務(wù),判斷是否相等,是否為專(zhuān)用連接if(con != connection) connection.close();} }?
轉(zhuǎn)載于:https://www.cnblogs.com/jiangbei/p/6704643.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的JavaWeb基础—dbutils的简单入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WCF技术剖析之十八:消息契约(Mess
- 下一篇: 《疯狂Java讲义》(二十九)----