JavaWeb基礎—dbutils的簡單入門

  簡明入門教程,參考:https://www.cnblogs.com/CQY1183344265/p/5854418.html

進行此章節之前,介紹一個JdbcUtils的再次的簡單封裝

  (例如后面需要構造QueryRunner時得到數據源等的簡便的操作)

package cn.itcast.jdbcutils;import java.sql.Connection;
import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtils {//使用的是默認的配置信息,注意給出c3p0-config.xml配置文件private static ComboPooledDataSource dataSource = new ComboPooledDataSource();//處理多線程的并發訪問問題,使用ThreadLocalprivate static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();public static Connection getConnection() throws SQLException{//不為Null說明開啟了事務,返回連接//先獲取自己線程的ConnectionConnection con = tl.get();if(con != null) return con;return dataSource.getConnection();}/*** 大方一點,給出連接池對象給你*/public static ComboPooledDataSource getDataSource(){return dataSource;}//給出三個方法/*** 開啟事務* 創建一個Connection,設置為手動提交* 保證DAO使用的就是這個事務的連接* 同時還需要保證下面兩個提交與回滾是同一個連接* 通過創建一個本類的連接成員* @throws SQLException */public static void startTransaction() throws SQLException{Connection con = tl.get();//開啟事務后con不再為nullcon = getConnection();con.setAutoCommit(false);//保存連接
        tl.set(con);}/*** 提交事務* @throws SQLException */public static void commitTransaction() throws SQLException{Connection con = tl.get();if(con == null) throw new SQLException("事務未開啟,請勿提交!");con.commit();con.close();//清空連接con = null;//移除事務
        tl.remove();}/*** 回滾事務* @throws SQLException */public static void rollbackTransaction() throws SQLException {Connection con = tl.get();if(con == null) throw new SQLException("事務未開啟,請勿回滾!");con.rollback();con.close();con = null;tl.remove();}/*** 用于釋放連接* @param connection* @throws SQLException */public static void releaseConnection(Connection connection) throws SQLException{//事務專用則不關閉,后續會有關閉//如果不是事務,則需要關閉Connection con = tl.get();//事務都沒有,直接關閉if(con == null) connection.close();//有事務,判斷是否相等,是否為專用連接if(con != connection) connection.close();}
}

?

一、簡易的入門:

    common-dbutils是Apache對Jdbc的一個簡單的封裝,其中主要涉及的類有:

      QueryRunner

      ResultSetHandler

      DbUtils

    使用的依賴如下:

    

?

  1.

  重要類 QueryRunner (構造時提供數據源)
  重要方法:int update(String sql,Object...params);增刪改
  重載版本 int update(Connection con,String sql,Object...params);本方法不再管理con,由外部提供(保證是同一個)
  T query(String sql,ResultSetHandler rsh,Object...params);查詢
  重載版本類同上

  給出一個使用的小例子:

  

package cn.itcast.demo;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;import cn.itcast.jdbcutils.JdbcUtils;/*** 測試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.

  給一張表對應一個類,字段與屬性對應起來

  他會先得到ResultSet,然后調用handler方法轉換成需要的類型
  接口ResultSetHandler,我們學習的實現類:
  BeanHandler 構造器需要一個class參數,返回指定類型的javabean對象 ?一行記錄
  BeanListHandler 構造器同上,由名稱知為多行,轉換成list對象,多個javabean ?多行記錄
  MapHandler 把一行記錄轉換成一個map (如{name:zhangsan,age:20}) ?一行記錄
  MapListHandler 同上對比,多個map的多行記錄,返回List<Map>,返回的也是一個List ?多行記錄
  ScalarHandler 單行單列,通常與select count(*) from stu; 單行單列

  這里使用裝飾者模式加上開頭改造的工具類,將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;
/*** 這個類可以自身自己處理連接問題,可以通過jdbcUtils釋放連接(類方法會處理是否關閉)* @author jiangbei01**/
public class TxQueryRunner extends QueryRunner {@Overridepublic int[] batch(String sql, Object[][] params) throws SQLException {/** 得到連接* 執行父類方法* 釋放連接* 返回值*/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 {/** 得到連接* 執行父類方法* 釋放連接* 返回值*/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;}}

給出一個使用改造類的小例子:

package cn.itcast.jdbcutils;import java.sql.Connection;
import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;public class AccountDAO {/*** 不能使用連接池* 要自己提供連接才能保證是同一個連接* @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};//給出參數并執行
    qr.update(sql,params);/** 以下代碼新寫的Tx類已經完成,無需處理* Connection con = JdbcUtils.getConnection();*     //釋放連接JdbcUtils.releaseConnection(con);*/}
}

?

  并發訪問時產生的問題,可以使用ThreadLocal類(待更新詳細)進行解決,示例如下:

package cn.itcast.jdbcutils;import java.sql.Connection;
import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtils {//使用的是默認的配置信息,注意給出c3p0-config.xml配置文件private static ComboPooledDataSource dataSource = new ComboPooledDataSource();//處理多線程的并發訪問問題,使用ThreadLocalprivate static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();public static Connection getConnection() throws SQLException{//不為Null說明開啟了事務,返回連接//先獲取自己線程的ConnectionConnection con = tl.get();if(con != null) return con;return dataSource.getConnection();}/*** 大方一點,給出連接池對象給你*/public static ComboPooledDataSource getDataSource(){return dataSource;}//給出三個方法/*** 開啟事務* 創建一個Connection,設置為手動提交* 保證DAO使用的就是這個事務的連接* 同時還需要保證下面兩個提交與回滾是同一個連接* 通過創建一個本類的連接成員* @throws SQLException */public static void startTransaction() throws SQLException{Connection con = tl.get();//開啟事務后con不再為nullcon = getConnection();con.setAutoCommit(false);//保存連接
        tl.set(con);}/*** 提交事務* @throws SQLException */public static void commitTransaction() throws SQLException{Connection con = tl.get();if(con == null) throw new SQLException("事務未開啟,請勿提交!");con.commit();con.close();//清空連接con = null;//移除事務
        tl.remove();}/*** 回滾事務* @throws SQLException */public static void rollbackTransaction() throws SQLException {Connection con = tl.get();if(con == null) throw new SQLException("事務未開啟,請勿回滾!");con.rollback();con.close();con = null;tl.remove();}/*** 用于釋放連接* @param connection* @throws SQLException */public static void releaseConnection(Connection connection) throws SQLException{//事務專用則不關閉,后續會有關閉//如果不是事務,則需要關閉Connection con = tl.get();//事務都沒有,直接關閉if(con == null) connection.close();//有事務,判斷是否相等,是否為專用連接if(con != connection) connection.close();}
}

?

轉載于:https://www.cnblogs.com/jiangbei/p/6704643.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456019.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456019.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456019.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

macos安裝vscode_VS Code 代碼編輯器入門指南:核心組件與概念

作者&#xff1a;思考問題的熊寫在前面如果當電腦只能裝一個軟件還需要盡量不影響日常學習工作時&#xff0c;不知道你的選擇會是什么。我把這個看似「荒誕」的問題理解為「All-in-One」的升級版拷問。這個問題陪伴了我很久&#xff0c;每用一個軟件我都會想想它對我究竟有多不…

環路濾波一些概念

熵編碼需要編碼的數據如下&#xff1a; 熵編碼需要編碼的數據如下&#xff1a;

【深度學習】TensorFlow之卷積神經網絡

卷積神經網絡的概念 在多層感知器&#xff08;Multilayer Perceptrons&#xff0c;簡稱MLP&#xff09;中&#xff0c;每一層的神經元都連接到下一層的所有神經元。一般稱這種類型的層為完全連接。 多層感知器示例 反向傳播 幾個人站成一排第一個人看一幅畫&#xff08;輸入數…

python中的zip模塊

zip壓縮 引入模塊&#xff1a; import zipfilezip文件格式是通用的文檔壓縮標準&#xff0c;在ziplib模塊中&#xff0c;使用ZipFile類來操作zip文件&#xff0c;下面具體介紹一下&#xff1a; zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) 功能&#xff1a;…

[LeetCode] 35. Search Insert Position

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may assume no duplicates in the array. Here are few examples.[1,3,5,6], 5 → 2[1,3,5,6], 2 → 1[1…

golang 的交叉編譯

為什么80%的碼農都做不了架構師&#xff1f;>>> Go是一門編譯型語言&#xff0c;所以在不同平臺上&#xff0c;需要編譯生成不同格式的二進制包。 由于Go 1.5對跨平臺編譯有了一些改進&#xff0c;包括統一了編譯器、鏈接器等。 編譯時候只需要指定兩個參數&#x…

【深度學習】Cifar-10-探究不同的改進策略對分類準確率提高

cifar10數據集上進行圖片分類&#xff0c;基于tensorflow框架&#xff0c; 旨在探究不同的改進策略對分類準確率的影響&#xff0c;如何一步步得提高準確率 一、問題描述 當我們在處理圖像識別或者圖像分類或者其他機器學習任務的時候&#xff0c;我們總是迷茫于做出哪些改進…

Acer 4750 安裝黑蘋果_黑蘋果 MacOS 10.15 Catalina安裝教程

一、準備工作一個8G以上的U盤(安裝 10.15 Catalina 必須要16G及以上的U盤 )&#xff1b;Mac OS鏡像、TransMac(刻錄工具)、DiskGenius(分區工具)、EasyUEFI(引導工區)、EFI驅動文件。安裝工具獲取方式&#xff1a;關注公眾號【遠景論壇】&#xff0c;回復&#xff1a;黑蘋果二、…

幀內16*16模式的宏塊數據傳輸順序

如果宏塊以16*16幀內模式編碼&#xff0c;那么塊-1首先被傳輸&#xff0c;攜帶的信息是每個4*4亮度塊的DC系數。然后&#xff0c;亮度殘差塊0-15被傳輸&#xff08;此時&#xff0c;16*16幀內宏塊的DC系數為零&#xff09;。對于亮度分量Cb和Cr&#xff0c;16和17塊攜帶DC系數的…

ceph中查看一個rbd的image的真實存儲位置

1、新建一個image存儲 rbd create hzb-mysql --size 2048 2、查看hzb-mysql的所有對象 一個rbd image實際上包含了多個對象&#xff08;默認情況下是image_size/4M&#xff09; [rootcc ~]# rbd info hzb-mysql rbd image hzb-mysql:size 2048 MB in 512 objectsorder 22 (4096…

python中的shutil模塊

shutil模塊 引入&#xff1a; import shutil copy() 功能&#xff1a;復制文件 格式&#xff1a;shutil.copy(來源文件,目標地址) 返回值&#xff1a;復制之后的路徑copy2() 功能&#xff1a;復制文件&#xff0c;保留元數據 格式&#xff1a;shutil.copy2(來源文件,目標地址…

亞馬遜低調收購Biba 或下月發布視頻消息服務

北京時間11月24日消息&#xff0c;據外媒報道&#xff0c;收購Twitch和Elemental Technologies似乎只是亞馬遜通過收購深耕視頻服務市場戰略的兩個元素。去年&#xff0c;亞馬遜還低調收購了創業公司Biba Systems&#xff0c;后者開發和運營面向企業用戶的視頻消息應用。消息人…

【tensorflow】static_rnn與dynamic_rnn的區別

static_rnn和dynamic_rnn的區別主要在于實現不同。 static_rnn會把RNN展平&#xff0c;用空間換時間。 gpu會吃不消&#xff08;個人測試結果&#xff09; dynamic_rnn則是使用for或者while循環。 調用static_rnn實際上是生成了rnn按時間序列展開之后的圖。打開tensorboard你…

pcie1 4 速度_太陽系行星們誰轉得最快?八大行星自轉速度排行榜,地球排第五...

不知道大家有沒有玩兒過陀螺呢&#xff1f;玩兒陀螺的技術如果很好的話&#xff0c;它可以在地上飛快地旋轉并且能夠旋轉很長的時間。有趣的是&#xff0c;宇宙中的很多星球就像陀螺一樣繞著一個中心軸旋轉著。這就是星球的自轉。在太陽系中有八顆大行星&#xff0c;它們都在自…

python中時間模塊

時間日期相關的模塊 calendar 日歷模塊time   時間模塊datetime 日期時間模塊timeit   時間檢測模塊 日歷模塊 calendar() 功能&#xff1a;獲取指定年份的日歷字符串 格式&#xff1a;calendar.calendar&#xff08;年份,w2,l1&#xff0c;c6,m3&#xff09; 返回值&…

硬盤接口詳細解釋

硬盤是電腦主要的存儲媒介之一&#xff0c;由一個或者多個鋁制或者玻璃制的碟片組成。碟片外覆蓋有鐵磁性材料。硬盤有固態硬盤&#xff08;SSD 盤&#xff0c;新式硬盤&#xff09;、機械硬盤&#xff08;HDD 傳統硬盤&#xff09;、混合硬盤&#xff08;HHD 一塊基于傳統機械…

【Keras】30 秒上手 Keras+實例對mnist手寫數字進行識別準確率達99%以上

本文我們將學習使用Keras一步一步搭建一個卷積神經網絡。具體來說&#xff0c;我們將使用卷積神經網絡對手寫數字(MNIST數據集)進行識別&#xff0c;并達到99%以上的正確率。 為什么選擇Keras呢&#xff1f; 主要是因為簡單方便。更多細節請看&#xff1a;https://keras.io/ …

分布式資本沈波:未來區塊鏈殺手級應用將出現在“+區塊鏈”

雷鋒網5月22日報道&#xff0c;日前“區塊鏈技術和應用峰會”在杭州國際博覽中心舉行。會上&#xff0c;分布式資本創始管理人沈波作了《區塊鏈的投資現狀與發展趨勢》演講。 沈波表示&#xff0c;由于區塊鏈的共識機制和無法篡改兩大特點&#xff0c;它在各行各業皆有應用潛力…

幀間預測小記

幀間預測后&#xff0c;在比特流中會有相應的信息&#xff1a;殘差信息&#xff0c;運動矢量信息&#xff0c;所選的模式。 宏塊的色度分量分辨率是亮度分辨率的一半&#xff08;Cr和Cb&#xff09;&#xff0c;水平和垂直均一半。色度塊采用和亮度塊一致的分割模式&#xff0…

ImageJ Nikon_科研論文作圖之ImageJ

各位讀者朋友們又見面了&#xff0c;今天給大家介紹一款圖片處理軟件——ImageJ&#xff0c;這是一款免費的科學圖像分析工具&#xff0c;廣泛應用于生物學研究領域。ImageJ軟件能夠對圖像進行縮放、旋轉、扭曲、模糊等處理&#xff0c;也可計算選定區域內分析對象的一系列幾何…