JDBC开源框架:DBUtils使用入门
在单元测试过程中,只涉及到数据库的直接操作来验证业务逻辑是否正确的情况,DBUtils非常适合使用。它结构简单,包小,友好处理掉那些jdbc异常,让你更专注于业务代码,而非底层的操作。官网对它的定义:Commons DbUtils库是一组小的类,旨在简化JDBC的工作。JDBC资源清理代码是普通的、容易出错的工作,因此这些类从您的代码中抽象出所有清理任务,从而使您真正想要做的事情是:查询和更新数据。
maven
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
此是一个非常简洁的工具包,核心二个部分:
1、*Runner 数据库连接操作类,比如增删改查
2、*Handler 结果返回转换类,默认提供常用的转换接口,如基本类型的转换DoubleColumnHandler、LongColumnHandler等。只实现ResultSetHandler接口就可以自定义转换器。
简单说下常用的API
QueryRunner : 此类能够使SQL查询简单化,也支持批量增删改查功能。执行完成后,会自动关闭所有连接,因些不需要手动再次写finally close。
ResultSetHandler : 只有一个简单的接口方法T handle(ResultSet rs)。能将数据转换成想要的任何形式,可以让应用更加简洁操作。默认提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等执行程序。
ColumnHandler : 接口定义让行数据转换。时间类型只实现java.sql.Timestamp的TimestampColumnHandler,在实际项目中,LocalDateTime类型都必需要自定义。
接下来看下具体使用步骤
1、加载jdbc驱动类,获取数据库connection
2、实例化QueryRunner 获得实例化对象queryRunner
3、实现ResultSetHandler,自定义需要转换的数据形式
4、利用queryRunner执行相关DB操作。
例子暂未使用连接池。
public class Member {
private int id;
private String account;
}
public Connection getConn() {
Connection conn = null;
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
一、执行增加insert语句有二种方式
1、用QueryRunner.insert()
@Test
public void insert_1() throws Exception {
QueryRunner runner = new QueryRunner();
String sql = "insert into member(account) value('sa')";
MapHandler rsh = new MapHandler();
Map<String, Object> map = runner.insert(getConn(), sql, rsh);
}
返回Map<String,Object> 是自增主键的值,格式:{"GENERATED_KEY":3}
2、用QueryRunner.update();
@Test
public void insert_2() throws Exception {
QueryRunner runner = new QueryRunner();
String sql = "insert into member(account) value('admin')";
int effect = runner.update(getConn(), sql);
}
返回影响的行数。
二、修改update、删除也是一种修改操作
@Test
public void update() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "update member set account = ? where id = ?";
Object[] param = {"tom",3};
int effect = runner.update(getConn(), sql, param);
//返回影响的行数
}
@Test
public void delete() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "delete from member where id = ?";
int effect = runner.update(getConn(), sql, 2);
//返回影响的行数
}
三、复杂的query,简单列举9种内置常见的handler
1、统计分组类。ScalarHandler 通常用于保存只有一行一列的结果集,例如分组函数
@Test
public void count() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select count(*) cnt from member";
long count = (long) queryRunner.query(getConn(), sql, new ScalarHandler()); // 默认得到结果集的第1列
long cnt = (long) queryRunner.query(getConn(), sql, new ScalarHandler("cnt")); //使用定义的别名
}
2、KeyedHandler 将结果集每一行数据保存到一个Map。里面map,key为列名,value为值;外面的map,key为指定列名的值,value对应的那条数据,即里面map
@Test
public void keyedhandler() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
Map<Object, Map<String, Object>> map = (Map<Object, Map<String, Object>>) queryRunner.query(getConn(), sql, new KeyedHandler<Object>("id"));
System.out.println(JSON.toJSONString(map));
}
3、MapListHandler 将结果集每一行数据保存到map中,key列名 value该列的值 ---- 再将所有map对象保存到List集合中
@Test
public void mapListQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
MapListHandler map = new MapListHandler();
List<Map<String, Object>> list = queryRunner.query(getConn(), sql, map);
}
4、 MapHander 将结果集第一行数据封装到Map集合中,key是列名,value为该列的值
@Test
public void mapQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
MapHandler map = new MapHandler();
Map<String, Object> m = queryRunner.query(getConn(), sql, map);
}
5、 ColumnListHandler 获得结果集的某一列,将该列的所有值存入List<Object>中。可以传columnIndex和columnName二参数,默认取第一列的值
@Test
public void columnListQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
ColumnListHandler<String> listHandler = new ColumnListHandler("id");
List<String> list = queryRunner.query(getConn(), sql, listHandler);
System.out.println(JSON.toJSONString(list));
}
6、BeanListHander 将结果集每一条数据,转为JavaBean对象,再保存到list集合中
@Test
public void beanListQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
BeanListHandler<Member> listHandler = new BeanListHandler(Member.class);
List<Member> list = queryRunner.query(getConn(), sql, listHandler);
System.out.println(JSON.toJSONString(list));
}
7、 BeanHandler 将结果集第一行数据封装到JavaBean对象中,与MapHandler意思一样
@Test
public void beanQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
BeanHandler<Member> listHandler = new BeanHandler(Member.class);
Member member = queryRunner.query(getConn(), sql, listHandler);
System.out.println(JSON.toJSONString(member));
}
8、 ArrayListHandler 将结果集每一行数据保存到List<Object[]>中
@Test
public void arrayListQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
ArrayListHandler listHandler = new ArrayListHandler();
List<Object[]> list = queryRunner.query(getConn(), sql, listHandler);
System.out.println(JSON.toJSONString(list));
}
9、 ArrayHandler 将结果集第一行数据保存到Object[]中
@Test
public void arrayQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
ArrayHandler listHandler = new ArrayHandler();
Object[] list = queryRunner.query(getConn(), sql, listHandler);
System.out.println(JSON.toJSONString(list));
}
JDBC开源框架:DBUtils使用入门的更多相关文章
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...
随机推荐
- maven学习之1
最近用maven的时候各种出问题,打算系统的学习一下maven,搞明白依赖之类的. (一)创建工程: mvn archetype:generate 这样就可以根据提示来建立一个maven项目,常用的有 ...
- Windows下pycharm远程连接服务器调试-tensorflow无法加载问题
最近打算在win系统下使用pycharm开发程序,并远程连接服务器调试程序,其中在import tensorflow时报错如图所示(在远程服务器中执行程序正常): 直观错误为: ImportError ...
- web-php绕过
0x01.web-PHP的悖论1 题目: 链接:http://game.sycsec.com:2009/10111.php 解题思路: 1.首先,web对于选择二进制方向的我这个菜鸡绝对是十分懵逼的, ...
- VueJS引入css或者less文件的一些坑
我们在做Vue+webpack的时,难免会引入各种公共css样式文件,那么我们改如何引入呢?引入时会有那些坑呢? 首先,引入公共样式时,我们在“main.js”里使用AMD的方式引入,即 requir ...
- eclipse环境下基于已构建struts2项目整合spring+hibernate
本文是基于已构建的struts2项目基础上整合 spring+hibernate,若读者还不熟悉struts2项目,请先阅读 eclipse环境下基于tomcat-7.0.82构建struts2项目 ...
- C语言之浮点数
#include<stdio.h> int main(){printf("请分别输入身高的英尺和英寸," "如输入\"5 7\"表示5英尺 ...
- 去培训机构参加IT培训值不值
近几年,IT培训机构可谓是琳琅满目,稂莠不齐.培训Java的,培训PHP的,培训大数据的等等吧,不一而足. 自己也算是IT技术圈子待了好多年了,面试过一些机构培训出来的学生,也有几个好哥们在培训机构做 ...
- javaScript基础概念小知识点集
数据类型 typeof是一个操作符而不是函数,因此例子中圆括号尽管可以使用,但不是必须的. 只要在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null NaN是一个特殊的数值,与任何值都 ...
- weex 环境搭建
最近为了项目需要(实际上是为了年底KPI),领导要求用3天时间,学习并使用weex开发一个页面,说实话,压力山大.在这之前压根儿就没听说过啊,一脸懵逼 无奈之余只能Google了,惊喜的发现weex的 ...
- Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现
大整数的四则运算已经是老生常谈的问题了.很多的库也已经包含了各种各样的解决方案. 作为练习,我们从最简单的加减法开始. 加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算. ...