JavaWeb学习笔记(十八)—— DBUtils的使用
一、DBUtils概述
1.1 什么是DBUtils
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
DBUtils最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。
使用DBUtils需要导包:commons-dbutils-1.4.jar
1.2 为什么要用DBUtils
在使用Dbutils 之前,我们Dao层使用的技术是JDBC,那么分析一下JDBC的弊端:
- 数据库连接对象、sql语句操作对象,封装结果集对象,这三大对象会重复定义
 - 封装数据的代码重复,而且操作复杂,代码量大
 - 释放资源的代码重复
 
而使用dbutils可以极大程度的简化代码书写,使得开发进度更快,效率更高。
二、QueryRunner类
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
- QueryRunner():创建一个与数据库无关的QueryRunner对象,后期在操作数据库的时候,需要手动给一个Connection对象,它可以手动控制事务。
- Connection.setAutoCommit(false); 设置手动管理事务
 - Connection.commit(); 提交事务
 
 
- QueryRunner(DataSource ds):创建一个与数据库关联的queryRunner对象,将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接。后期在操作数据库的时候,不需要Connection对象,自动管理事务。
 
2.1 QueryRunner类的主要方法
【更新操作】——可执行增删改语句
- int update(Connection con, String sql, Object… params):需要调用者提供Connection,这说明本方法不再管理Connection了。支持事务!调用的是同一个Connection
 int update(String sql, Object… params):此方法在创建QueryRunner时传递了连接池对象,那么在调用update()方法时就不用再传递Connection了。若多次调用,返回的Connection不能保证为同一个,不支持事务。
【查询操作】
- public <T> T query(Connection con, String sql, ResultSetHandler<T> rh, Object… params):它会先得到ResultSet,然后通过rh把ResultSet转换成对应的类型再返回。支持事务
 public <T> T query(String sql, ResultSetHandler<T> rh, Object… params):几乎与第一种方法一样,只是不支持事务
2.2 使用QueryRunner类实现CRUD
public class DBUtilsTest {
    @Test
    public void add() throws SQLException {
        //将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接
        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "insert into t_user values(?,?)";
        qr.update(sql, "1", "张三");
    }
    @Test
    public void delete() throws SQLException {
        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "delete from t_user where id=?";
        qr.update(sql, 1);
    }
    @Test
    public void update() throws SQLException {
        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "update t_user set name=? where id=?";
        qr.update(sql, "李四", "1");
    }
    @Test
    public void find() throws SQLException {
        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from t_user where id=?";
        User user = qr.query(sql, new BeanHandler<User>(User.class),1);
        System.out.println(user.getName());
    }
}
三、ResultSetHandler接口
我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来把ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
3.1 ResultSetHandler接口的实现类
- BeanHandler:单行处理器,构造器需要一个Class类型的参数,用来把一行结果转换成指定类型的javaBean对象
@Test
public void fun1() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_user where id=?"; // 执行query()方法,需要给出结果集处理器,即ResultSetHandler的实现类对象
// 我们给的是BeanHandler,它实现了ResultSetHandler
// 它需要一个类型,然后它会把rs中的数据封装到指定类型的JavaBean对象中,然后返回JavaBean
User user = qr.query(sql, new BeanHandler<User>(User.class), 1);
System.out.println(user);
} BeanListHandler:多行处理器,构造器也是需要一个Class类型的参数,用来把一行结果集转换成一个javabean,那么多行就是转换成List对象,一堆javabean
/**
* BeanListHandler的应用,它是多行处理器
* 每行对象一个User对象
*/
@Test
public void fun2() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_user";
List<User> userList = qr.query(sql, new BeanListHandler<User>(User.class));
System.out.println(userList);
}MapHandler:单行处理器,把一行结果集转换Map<String,Object>,其中列名为键。依赖的是HashMap
@Test
public void fun3() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_user where id=?";
Map<String, Object> map = qr.query(sql, new MapHandler(), 1);
System.out.println(map);
}MapListHandler:多行处理器,把一行记录转换成一个Map<String,Object>,多行就是多个Map,即List<Map<String,Object>>
@Test
public void fun4() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_user";
List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
System.out.println(mapList);
}ScalarHandler:单行单列处理器,把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student
@Test
public void fun5() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select count(*) from t_user";
Number cnt = (Number) qr.query(sql, new ScalarHandler());
long c = cnt.longValue();
System.out.println(c);
}
JavaWeb学习笔记(十八)—— DBUtils的使用的更多相关文章
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
		
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
 - (C/C++学习笔记) 十八. 继承和多态
		
十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...
 - Java基础学习笔记十八 异常处理
		
什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在 ...
 - JavaWeb学习 (二十八)————文件上传和下载
		
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
 - Javaweb学习笔记——(八)——————常见系统体系结构,Tomcat,以及web的内部外部应用,http协议概述
		
·软件系统体系结构: 1.常见软件系统体系结构B/S.C/S C/S 1.C/S结构即客户端/服务器(Client/Server),列如QQ: 2.需要编写服务器端程序,以及客户端程序,列如我们安装的 ...
 - JavaWeb学习笔记(八)—— EL表达式
		
一.EL表达式概述 在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法会使JSP页面混乱,难以维护.为此,在JSP2.0规范中提供了EL表达式.EL全名 ...
 - MYSQL进阶学习笔记十八:MySQL备份和还原!(视频序号:进阶_37)
		
知识点十九:MySQL的备份的还原(38) 一.mysql的备份 1.通过使用mysqldump的命令备份 使用mysqldump命令备份,mysqldump命令将数据库中的数据备份成一个文本文件.表 ...
 - JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)
		
1.事件冒泡与事件捕获 2.事件与事件句柄 3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处: 1.每个函 ...
 - python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制
		
django Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...
 - javaweb学习总结(十八)——JSP属性范围
		
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
 
随机推荐
- java简单例子介绍IOC和AOP
			
IOC和AOP的一些基本概念 介绍 IOC 一.什么是IOC IoC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内 ...
 - 可epoll队列
			
什么是可epoll队列? 就可以使用epoll来监控队列中是否有数据的队列,当然也支持select和poll. 应用场景 一个线程,需要将队列(共享内存队列或普通队列均可)中的数据取出来,然后通过网络 ...
 - 使用GeoServer+QGIS发布WMTS服务 | Publishing WMTS Service Using GeoServer+QGIS
			
Web GIS系列: 1.搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 2.使用GeoServer+QGIS发布WMTS服务 3.使 ...
 - 编写高质量代码改善C#程序的157个建议——建议153:若抛出异常,则必须要注释
			
建议153:若抛出异常,则必须要注释 有一种必须加注释的场景,即使异常.如果API抛出异常,则必须给出注释.调用者必须通过注释才能知道如何处理那些专有的异常.通常,即便良好的命名也不可能告诉我们方法会 ...
 - 练习题。对DOM中document的深刻理解巩固
			
//window.onload = modTwo; 1.点击单元格内容 弹窗promrt接收值 将接受的值提换单元格内容 2.点击单元格 出现2个按钮 加粗 字体颜色标红 ...
 - 【Android学习】Service&Boradcast初步
			
Service初步 掌握Service概念 掌握Service分类 Service开发能力具备 了解Service和intentService类的区别 重点难点 StartService和BoundS ...
 - FileInputStream和FileOutStream的使用——文件字节输入/输出流
			
最近又退回到java EE的学习,这篇博客就来讲解一下字节流中最重要的两个类FileInputStream和FileOutputStream的用法: FileInputStream:全称是文件字节输入 ...
 - GCT感受
			
GCT考试已经结束了,但是复习GCT的时候一直没来得及总结点什么,GCT考的比较基础,所以复习起来并不是特别费力,但是还是有一些东西值得我们去学习的. 对于GCT考试,一开始在报名的时候其实心里是挺抵 ...
 - Acrobat_8_Pro_SC  激活老是提示你输入的授权码无效
			
假如安装了Adobe Acrobat Professional 8 的时候无法激活, 或在恢复安装时 Adobe Acrobat Professional 8 需要重新激活, 激活的时候,总是提示你输 ...
 - opencv——(动态)旋转图像
			
#include "stdafx.h" #include <opencv2\opencv.hpp> #include <opencv\cv.h> #incl ...