日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dbutils API学习

發(fā)布時間:2024/9/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dbutils API学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

dbutils API介紹

1.簡介

? dbutils就是JDBC操作的類庫,是對JDBC操作的封裝,提供一些簡易的API來操作數(shù)據(jù)庫,提供了數(shù)據(jù)庫增刪改查等通用的JDBC實現(xiàn)。

2.org.apache.commons.dbutils.handlers包

? 這個包里面的類是對ResultSetHandler接口的實現(xiàn)類,主要是用來處理ResultSet(結果集)的轉換,將結果集轉成Object[],List< Object[] >,List< T >,Map< K,V >等的數(shù)據(jù)結構。這些實現(xiàn)類會在做數(shù)據(jù)庫查詢操作時使用,主要有以下類:

  • AbstractListHandler  將ResultSet轉為List的抽象類
  • ArrayHandler   將ResultSet轉為一個Object[]的ResultSetHandler實現(xiàn)類
  • ArrayListHandler   將ResultSet轉換為List< Object[] >的ResultSetHandler實現(xiàn)類
  • BeanHandler   將ResultSet行轉換為一個JavaBean的ResultSetHandler實現(xiàn)類
  • BeanListHandler   將ResultSet轉換為List< T >的ResultSetHandler實現(xiàn)類
  • ColumnListHandler  將ResultSet的一個列轉換為List< Object >的ResultSetHandler實現(xiàn)類
  • KeyedHandler   將ResultSet轉換為Map< K,V>的ResultSetHandler實現(xiàn)類
  • MapHandler   將ResultSet的首行轉換為一個Map的ResultSetHandler實現(xiàn)類
  • MapListHandler   將ResultSet轉換為List< K,V>的ResultSetHandler實現(xiàn)類
  • ScalarHandler   將ResultSet的一個列到一個對象。

3.org.apache.commons.dbutils.QueryRunner

? 它與ResultSetHandler組合在一起使用可以完成大部分的數(shù)據(jù)庫操作,是用來執(zhí)行SQL語句的工具類。主要的方法如下。

QueryRunner的無參構造函數(shù)和有參構造函數(shù):

  • 用QueryRunner無參構造函數(shù)創(chuàng)建的對象,手動提交事務。
  • 用QueryRunner有參構造函數(shù)創(chuàng)建的對象,自動提交事務。
  • QueryRunner中一共有6種方法:

    • execute(執(zhí)行SQL語句)
    • batch(批量處理語句)
    • insert(執(zhí)行INSERT語句)
    • insertBatch(批量處理INSERT語句)
    • query(SQL中 SELECT 語句)
    • update(SQL中 INSERT, UPDATE, 或 DELETE 語句)

    比較常用就是query和update

    3.1 query

    query要用到org.apache.commons.dbutils.handlers包下的實現(xiàn)類,這類提供了ResultSet(結果集)的轉換。

    ArrayHandler例子:

    這個是放回一個Object[]對象,一個Object[]對應一行數(shù)據(jù),如:{1,“zs”}

    public static void testArrayHandler() throws SQLException{//自己寫的DataSourceUtil.getDataSourceWithC3P0(),返回datasource//QueryRunner執(zhí)行工具QueryRunner runner = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());//返回第一個數(shù)據(jù)(ResultSet轉成Object[]),一個Object[]對應表查詢的一行數(shù)據(jù)Object[] student = runner.query("select id,name from student where id>?", new ArrayHandler(),1);System.out.println(student[0]+"\t"+student[1]); }

    ArrayListHandler例子

    這個是放回一個List<Object[]>對象,如:[ {1,“zs”},{2,“李”} ]

    public static void testArrayHandler() throws SQLException{//自己寫的DataSourceUtil.getDataSourceWithC3P0(),返回datasource//QueryRunner執(zhí)行工具QueryRunner runner = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());//ResultSet轉成list<Object[]>,查詢多行操作List<Object[]> student = runner.query("select id,name from student", new ArrayHandler());System.out.println(student[0]+"\t"+student[1]); }

    MapHandler例子

    這個是放回一個Map<K,V>對象,{ID=1,name=“ZS”}

    public void testMapHandler() throws SQLException{ QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());String sql = "select * from users";//做出mapMap<String,Object> map = qr.query(sql, new MapHandler());for(Map.Entry<String, Object> me : map.entrySet()){System.out.println(me.getKey() + "=" + me.getValue());} }

    MapListHandler例子

    List<Map<K,V>>,如[{ID=1,name=“ZS”},{ID=2,name=“l(fā)s”}]

    public void testMapListHandler() throws SQLException{QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());String sql = "select * from users";List<Map<String,Object>> list = (List) qr.query(sql, new MapListHandler());for(Map<String,Object> map :list){for(Map.Entry<String, Object> me : map.entrySet())System.out.println(me.getKey() + "=" + me.getValue());} }

    KeyedHandler例子

    Map<Integer,Map<String,Object>>,就是Map里面套map,如:{1={ID=1,name=“ZS”},2={ID=2,name=“l(fā)s”}}

    public void testKeyedHandler() throws Exception{QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());String sql = "select * from users";//MAP里面套mapMap<Integer,Map<String,Object>> map = qr.query(sql, new KeyedHandler("id"));for(Map.Entry<Integer, Map> me : map.entrySet()){int id = me.getKey();Map<String,Object> innermap = me.getValue();for(Map.Entry<String, Object> innerme : innermap.entrySet()){String columnName = innerme.getKey();Object value = innerme.getValue();System.out.println(columnName + "=" + value);} } }

    3.2 update

    update會相對簡單很多,用來執(zhí)行數(shù)據(jù)庫的DML操作,因為不涉及ResultSet,所以直接給SQL語句和變量值就可以了。

    增操作

    public void Insert() throws SQLException{ QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());String sql = "insert into student(id,name) value(?,?)"; int count = qr.query(sql, new Object[]{"1","zs"}); }

    刪操作

    public void Delete() throws SQLException{ QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());String sql = "delete from student where id = ?"; qr.query(sql, 1); }

    改操作

    public void Updata() throws SQLException{ QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());String sql = "updata from student set name = ? where id = ?"; qr.query(sql, new Object[]{"1","xiaoming"}); }

    4.事務手動提交

    重復一下QueryRunner的構造函數(shù),如果我們需要手動提交事務用無參構造。

    QueryRunner的無參構造函數(shù)和有參構造函數(shù):

  • 用QueryRunner無參構造函數(shù)創(chuàng)建的對象,手動提交事務。
  • 用QueryRunner有參構造函數(shù)創(chuàng)建的對象,自動提交事務。
  • 自動提交事務將每個SQL語句都當成一個事務并進行提交,而有時候我們需要把多個SQL語句當成一個事務來處理,舉個簡單的也是最經典的例子:銀行轉賬。

    ? 如:A轉錢給B,我們需要完成以下操作,A賬戶減去轉賬金額,B賬戶加上轉賬金額。這個過程涉及多個SQL操作(兩個修改updata),如果我們使用自動提交(每個SQL一個事務),那么就可能發(fā)生以下情況,A賬戶減去轉賬金額,但當B賬戶加上轉賬金時額發(fā)生錯誤。出現(xiàn)A減錢了B沒加錢。因為是自動提交,B加錢發(fā)生錯誤也只是B的事務回滾,不涉及A。如果我把這個過程涉及多個SQL操作放到一個事務里面,那么任何一邊發(fā)生錯誤,事務都會回滾,因為事務的原子性(Atomicity):事務中的全部操作在數(shù)據(jù)庫中是不可分割的,要么全部完成,要么全部不執(zhí)行。每次手動提交都會將執(zhí)行SQL語句放到同一個事務里面(運行多個SQL語句,然后提交,那么執(zhí)行的SQL語句都放在一個事務里面)。

    其中這里與JDBC的基礎有關,可以看以下代碼例子:

    public void QueryRunnertest() throws SQLException{ String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC";String user = "root" ; String password = "root";//這里隨便創(chuàng)建一個連接Connection conn= DriverManager.getConnection(url,user,password);//設置連接為手動提交conn.setAutoCommit(false);//因為用手動提交,所以需要無參構造,有參的會幫你自動提交的QueryRunner qr = new QueryRunner();//插入SQLString sql = "insert into student(id,name) value(?,?)"; try{//只需要把連接傳給函數(shù)就行了int count1 = qr.query(conn,sql, new Object[]{"1","zs"}); int count2 = qr.query(conn,sql, new Object[]{"2","ls"});int count3 = qr.query(conn,sql, new Object[]{"3","ww"});//提交事務conn.commit();}catch(Exception e){//操作回滾conn.rollback(); //一旦其中一個操作出錯都將回滾,使全部操作都不成功 (事務原子性)} }

    在這里例子里面,先獲取連接,然后設置連接為手動提交,并創(chuàng)建QueryRunner工具類,并使用工具里面的函數(shù)通過傳遞連接,SQL語句,變量。

    總結

    以上是生活随笔為你收集整理的dbutils API学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美一级三级 | 国产女人高潮时对白 | 亚洲天堂手机版 | 亚洲av电影天堂男人的天堂 | 国产真人做爰毛片视频直播 | 91嫩草欧美久久久九九九 | 女人被狂躁c到高潮 | 免费精品视频 | www.成人在线 | 三级av免费看 | 亚洲成人午夜在线 | 美日韩精品一区二区 | 国产精久久一区二区三区 | 狠狠看 | 一级片99 | 看黄色一级视频 | 欧美一区二区三区成人精品 | 国产精品久久久久久亚洲影视 | 无套白嫩进入乌克兰美女 | 中文字幕无码人妻少妇免费 | 无码人妻一区二区三区av | 久久一 | 男人av资源 | 亚洲欧美日韩一区在线观看 | www.蜜桃av| 久久久久九九九 | 日韩欧美在线观看视频 | 99爱国产 | 国产在线拍揄自揄拍 | 亚洲精品久久久久av无码 | 91精品婷婷国产综合久久 | 永久免费看成人av的动态图 | 尤物视频在线观看免费 | 激情小视频 | 九九热九九 | 美女激情av | 午夜影院 | 91视频一区二区三区 | 丁香激情婷婷 | 精品国产中文字幕 | 日韩黄色在线视频 | 在线观看h网站 | 午夜视频免费在线观看 | 成人午夜又粗又硬又大 | 伊人久久狼人 | 人妻妺妺窝人体色www聚色窝 | 丰满白嫩尤物一区二区 | 4438x全国最大成人网 | 波多野结衣影院 | 欧美成人精品欧美一级乱 | 99久| 久久亚洲av成人无码国产电影 | 青青草97国产精品免费观看 | 申鹤乳液狂飙 | www.五月激情 | 神马久久午夜 | 精品久久久视频 | 午夜电影网一区 | 蜜臀人妻四季av一区二区不卡 | 国产性猛交╳xxx乱大交一区 | 久久九九久精品国产免费直播 | 亚洲图片在线视频 | 婷婷色网| 日本免费黄色网址 | 猛男大粗猛爽h男人味 | 疯狂伦交 | 用力使劲高潮了888av | 成人国产精品免费观看视频 | 男女啊啊啊视频 | 污片免费在线观看 | av在线网址大全 | 手机在线看片你懂的 | 亚洲在线观看一区 | 国产丝袜视频 | 国产成人精品一区二区三区福利 | 中文字幕色图 | av一区二区三区四区 | 午夜寂寞影院在线观看 | 黄色1级视频 | av一卡| 麻豆网址| 麻豆精品一区二区三区 | 青青草精品 | 亚洲视频一二三四 | 91日韩中文字幕 | 欧美性猛交xxxx乱大交蜜桃 | 国产成人免费看一级大黄 | 国产色 | 日韩激情在线视频 | 91精品国产自产精品男人的天堂 | 国产一级片一区二区 | 岳狂躁岳丰满少妇大叫 | 午夜天堂精品久久久久 | 91射| 日日操视频| 久久久欧美 | 久久中文字幕人妻熟av女蜜柚m | 88av网站 | 国产欧美在线观看不卡 |