dbutils API介绍

1.简介

​ dbutils就是JDBC操作的类库,是对JDBC操作的封装,提供一些简易的API来操作数据库,提供了数据库增删改查等通用的JDBC实现。

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

​ 这个包里面的类是对ResultSetHandler接口的实现类,主要是用来处理ResultSet(结果集)的转换,将结果集转成Object[],List< Object[] >,List< T >,Map< K,V >等的数据结构。这些实现类会在做数据库查询操作时使用,主要有以下类:

  • AbstractListHandler  将ResultSet转为List的抽象类
  • ArrayHandler   将ResultSet转为一个Object[]的ResultSetHandler实现类
  • ArrayListHandler   将ResultSet转换为List< Object[] >的ResultSetHandler实现类
  • BeanHandler   将ResultSet行转换为一个JavaBean的ResultSetHandler实现类
  • BeanListHandler   将ResultSet转换为List< T >的ResultSetHandler实现类
  • ColumnListHandler  将ResultSet的一个列转换为List< Object >的ResultSetHandler实现类
  • KeyedHandler   将ResultSet转换为Map< K,V>的ResultSetHandler实现类
  • MapHandler   将ResultSet的首行转换为一个Map的ResultSetHandler实现类
  • MapListHandler   将ResultSet转换为List< K,V>的ResultSetHandler实现类
  • ScalarHandler   将ResultSet的一个列到一个对象。

3.org.apache.commons.dbutils.QueryRunner

​ 它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,是用来执行SQL语句的工具类。主要的方法如下。

QueryRunner的无参构造函数和有参构造函数:

  1. 用QueryRunner无参构造函数创建的对象,手动提交事务。
  2. 用QueryRunner有参构造函数创建的对象,自动提交事务。

QueryRunner中一共有6种方法:

  • execute(执行SQL语句)
  • batch(批量处理语句)
  • insert(执行INSERT语句)
  • insertBatch(批量处理INSERT语句)
  • query(SQL中 SELECT 语句)
  • update(SQL中 INSERT, UPDATE, 或 DELETE 语句)

比较常用就是query和update

3.1 query

query要用到org.apache.commons.dbutils.handlers包下的实现类,这类提供了ResultSet(结果集)的转换。

ArrayHandler例子:

这个是放回一个Object[]对象,一个Object[]对应一行数据,如:{1,“zs”}

public static void testArrayHandler() throws SQLException{//自己写的DataSourceUtil.getDataSourceWithC3P0(),返回datasource//QueryRunner执行工具QueryRunner runner = new QueryRunner(DataSourceUtil.getDataSourceWithC3P0());//返回第一个数据(ResultSet转成Object[]),一个Object[]对应表查询的一行数据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执行工具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=“ls”}]

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=“ls”}}

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会相对简单很多,用来执行数据库的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的构造函数,如果我们需要手动提交事务用无参构造。

QueryRunner的无参构造函数和有参构造函数:

  1. 用QueryRunner无参构造函数创建的对象,手动提交事务。
  2. 用QueryRunner有参构造函数创建的对象,自动提交事务。

自动提交事务将每个SQL语句都当成一个事务并进行提交,而有时候我们需要把多个SQL语句当成一个事务来处理,举个简单的也是最经典的例子:银行转账。

​ 如:A转钱给B,我们需要完成以下操作,A账户减去转账金额,B账户加上转账金额。这个过程涉及多个SQL操作(两个修改updata),如果我们使用自动提交(每个SQL一个事务),那么就可能发生以下情况,A账户减去转账金额,但当B账户加上转账金时额发生错误。出现A减钱了B没加钱。因为是自动提交,B加钱发生错误也只是B的事务回滚,不涉及A。如果我把这个过程涉及多个SQL操作放到一个事务里面,那么任何一边发生错误,事务都会回滚,因为事务的原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。每次手动提交都会将执行SQL语句放到同一个事务里面(运行多个SQL语句,然后提交,那么执行的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";//这里随便创建一个连接Connection conn= DriverManager.getConnection(url,user,password);//设置连接为手动提交conn.setAutoCommit(false);//因为用手动提交,所以需要无参构造,有参的会帮你自动提交的QueryRunner qr = new QueryRunner();//插入SQLString sql = "insert into student(id,name) value(?,?)";  try{//只需要把连接传给函数就行了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();    //一旦其中一个操作出错都将回滚,使全部操作都不成功 (事务原子性)}
}

在这里例子里面,先获取连接,然后设置连接为手动提交,并创建QueryRunner工具类,并使用工具里面的函数通过传递连接,SQL语句,变量。

dbutils API学习相关推荐

  1. Crypto API 学习笔记一

    标 题: [原创]Crypto API 学习笔记一 作 者: jdxyw 时 间: 2006-09-01,16:47 链 接: http://bbs.pediy.com/showthread.php? ...

  2. IOS 14.5版本之解档和归档的API学习

    IOS 14.5版本之解档和归档的API学习 第一部分 回顾一下老api的使用,将对象持久化至硬盘里面. 1.为什么我们要学习解档和归档, 有什么作用.当 plist 文件存储无法满足我们的需求的时候 ...

  3. libvirt API学习笔记

    为环境CentOS5.5 从官方网站上下载了文档   libvirt 0.7.5  Application  Development Guide 由于CentOS自带libvirt版本为0.6.3的, ...

  4. Netty 学习之旅:ByteBuf 篇之 ByteBuf 内部结构与 API 学习

    1.原生 ByteBuffer.ByteBuf 内部结构设计 首先我们来回顾一下 java.nio.ByteBuffe r的内部结构设计. ByteBuffer 内部持有一个 byte[] bt, 再 ...

  5. javascript:常用API学习Math.random, toString,slice(),substr(),Math.ceil()

    javascript:常用API学习 1.获得随机数:Math.random() 如何随机获得整数? 2.如何转进制:十进制转二进制?: 变量名.toString(进制数) 3. 36进制:能把一个小 ...

  6. 图形API学习工程(10):基础光照

    工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 目标 在<图形API学习工程(6):创建并使用UniformBuffer>中,Unifor ...

  7. openGL之API学习(一八九)gl_Position gl_Vertex

    gl_Position是顶点着色器(所有版本的顶点着色器)必须计算的值,是每个顶点的最终的位置信息.这里的顶点位置信息是通过glVertexAttribPointer上传的. #version 430 ...

  8. SIEMENS PLC Web API 学习记录

    SIEMENS PLC Web API 学习记录 为顺应时代发展,西门子为 S7-200SMART/1200/1500 PLC 添加IT通讯所需要的 Web API.(由于S7-200 SMART 新 ...

  9. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

最新文章

  1. Android seLinux 设置
  2. DataList控件分页
  3. idea springboot一直卡在启动 没有日志输出
  4. WinRAR 在cmd执行rar压缩命令
  5. Python 调试 PDB
  6. redis java 发布订阅_Redis之发布订阅(Java)
  7. (day 53 - 动态规划 ) 剑指 Offer 63. 股票的最大利润
  8. ROS语音识别科大讯飞语音SDK
  9. 分享一套比较全的Java技术栈,值得参考!
  10. 浦发银行计算机抓紧用面试题目,浦发银行面试问题
  11. 怎么实现类似星星闪烁的效果(box-shadow)
  12. 图片太大,怎么压缩图片大小?
  13. americdan-life
  14. 项目一之绘制小王八爬行
  15. 【简单总结】SLAM 算法的 Benchmark 及相关数据集的结果对比
  16. vue2[初级]事件处理器
  17. 灵隐寺招聘:没有KPI、佛系上班、一切随缘
  18. Ubuntu10.04下载Android-x86(froyo-x86)源代码步骤
  19. spring boot小说网站系统毕业设计源码041446
  20. 计算机64位变32位,怎么将64位的系统变成32位的系统

热门文章

  1. 用VisualVM分析MyEclipse
  2. Asp.Net MVC 3【URLs, Routing,and Areas】续
  3. 数据库事务隔离级别(转)
  4. 添加web引用和添加服务引用有什么区别?
  5. oracle 物化视图 --转
  6. IntelliJ IDEA 提交代码时出现:Code analysis failed with exception: com.intellij.psi......(亲测)
  7. windows系统如何查看端口被占用、杀进程
  8. idea快速从dao层跳转到mapper.xml文件的插件
  9. 用grep和cut做一些数据统计
  10. MySQL加索引避免锁表:避开事务 lock_wait_timeout 副本