commons-dbutils是Apache开源组织提供的用于操作数据库的工具包。今天为大家介绍一下该包的常用方法。 
对于数据库的操作无外乎增删改查,而增删改本质上可以归为一类,操作方式相同,只是SQL语法不同而已,所以我将以修改和查询两类来介绍commons-dbutils的用法。

首先我们来创建一个测试类,使用JUnit进行测试。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; public class DBUtilsTest
{
private Connection conn = null; @Before
public void initConnection() throws SQLException, ClassNotFoundException
{
printCurrentMethodName();
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
} @Before
public void initDatabase() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
runner.update(
conn,
"CREATE TABLE IF NOT EXISTS USER_INFO (userId VARCHAR(20) PRIMARY KEY, userName VARCHAR(50))");
} @After
public void destory()
{
printCurrentMethodName();
DbUtils.closeQuietly(conn);
} /**
* 打印当前运行方法名称
*/
public void printCurrentMethodName()
{
System.out.println(Thread.currentThread().getStackTrace()[2]
.getMethodName());
System.out.println("==================================================");
}
}

  

在这段测试代码中,我们是用h2作为数据库进行测试以及定义了一些连接、数据库的初始化及销毁的方法。 
commons-dbutils中操作数据库的常用类为:QueryRunner。 
QueryRunner的常用方法如下:

返回值 方法名 说明
int[] batch(Connection conn, String sql, Object[][] params) 批量执行INSERT、UPDATE或DELETE
int[] batch(String sql, Object[][] params) 批量执行INSERT、UPDATE或DELETE
T insert(Connection conn, String sql, ResultSetHandler rsh) 执行一个插入查询语句
T insert(Connection conn, String sql, ResultSetHandler rsh, Object… params) 执行一个插入查询语句
T insert(String sql, ResultSetHandler rsh) 执行一个插入查询语句
T insert(String sql, ResultSetHandler rsh, Object… params) 执行一个插入查询语句
T insertBatch(Connection conn, String sql, ResultSetHandler rsh, Object[][] params) 批量执行插入语句
T insertBatch(String sql, ResultSetHandler rsh, Object[][] params) 批量执行插入语句
T query(Connection conn, String sql, ResultSetHandler rsh) 查询
T query(Connection conn, String sql, ResultSetHandler rsh, Object… params) 查询
T query(String sql, ResultSetHandler rsh) 查询
T query(String sql, ResultSetHandler rsh, Object… params) 查询
int update(Connection conn, String sql) 执行INSERT、UPDATE或DELETE
int update(Connection conn, String sql, Object… params) 执行INSERT、UPDATE或DELETE
int update(Connection conn, String sql, Object param) 执行INSERT、UPDATE或DELETE
int update(String sql) 执行INSERT、UPDATE或DELETE
int update(String sql, Object… params) 执行INSERT、UPDATE或DELETE
int update(String sql, Object param) 执行INSERT、UPDATE或DELETE

 
 
 

修改

我们先来看一下如何使用QueryRunner进行修改操作,在我们的测试代码中添加测试方法:

@Test
public void update() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
String suffix = Long.toHexString(System.currentTimeMillis());
Integer result = runner.update(conn,
"insert into USER_INFO(userId, userName) values(?, ?)", suffix,
"name" + suffix);
System.out.println("受影响记录条数:" + result);

  

修改的操作相比较而言还是很简单的,在这段测试代码中,我们向数据库中添加了一条记录,在QueryRunner中也是支持动态参数的,可以很方便的绑定参数

查询

ScalarHandler

ScalarHandler会返回一个对象,用于读取结果集中第一行指定列的数据。这里我们以查询表中总记录数为例:

@Test
public void queryByScalarHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Number number = runner.query(conn, "select count(*) from USER_INFO",
new ScalarHandler<Number>());
System.out.println("总记录记录条数:" + number.intValue());
}

  

不知大家有没有发现,在ScalarHandler的泛型中,我使用的是Number,解释一下:之前我在使用该方法查询记录条数的时候,不同的数据库返回的数据类型可能不同,有的返回是Integer,而有的却是Long,为了代码的通用,所以在这里我使用了Number

ArrayHandler

ArrayHandler会返回一个数组,用于将结果集第一行数据转换为数组。

@Test
public void queryByArrayHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Object[] results = runner.query(conn, "select * from USER_INFO",
new ArrayHandler());
System.out.println(Arrays.asList(results));
}

  

ArrayListHandler

ArrayListHandler会返回一个集合,集合中的每一项对应结果集指定行中的数据转换后的数组。

@Test
public void queryByArrayListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Object[]> results = runner.query(conn, "select * from USER_INFO",
new ArrayListHandler());
for (Object[] object : results)
{
System.out.println(Arrays.asList(object));
}
}

  

KeyedHandler

KeyedHandler会返回一个Map,我们可以指定某一列的值作为该Map的键,Map中的值为对应行数据转换的键值对,键为列名。

@Test
public void queryByKeyedHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new KeyedHandler<String>());
System.out.println(results);
}

  

ColumnListHandler

ColumnListHandler会返回一个集合,集合中的数据为结果集中指定列的数据。

@Test
public void queryByColumnListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<String> results = runner.query(conn, "select * from USER_INFO",
new ColumnListHandler<String>());
System.out.println(results);
}

  

MapHandler

MapHandler会将结果集中第一行数据转换为键值对,键为列名。

@Test
public void queryByMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Object> results = runner.query(conn,
"select * from USER_INFO", new MapHandler());
System.out.println(results);
}

  

MapListHandler

MapHandler会将结果集中的数据转换为一个集合,集合中的数据为对应行转换的键值对,键为列名

@Test
public void queryByMapListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new MapListHandler());
System.out.println(results);
}

  

BeanHandler

BeanHandler实现了将结果集第一行数据转换为Bean对象,在实际应用中非常方便。

在编写测试代码之前,我们先来编写一个对应的Bean类:

import java.text.MessageFormat;

public class UserInfo
{
private String userId;
private String userName; public String getUserId()
{
return userId;
} public void setUserId(String userId)
{
this.userId = userId;
} public String getUserName()
{
return userName;
} public void setUserName(String userName)
{
this.userName = userName;
} @Override
public String toString()
{
return MessageFormat
.format("[userId:{0},userName:{1}]", userId, userName);
}
}

  

接下来,我们来编写测试代码:

@Test
public void queryByBeanHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
UserInfo results = runner.query(conn, "select * from USER_INFO",
new BeanHandler<UserInfo>(UserInfo.class));
System.out.println(results);
}

  

BeanListHandler

BeanHandler只转换结果集的第一行,而BeanListHandler会将结果集的所有行进行转换,返回一个集合。

@Test
public void queryByBeanListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<UserInfo> results = runner.query(conn, "select * from USER_INFO",
new BeanListHandler<UserInfo>(UserInfo.class));
System.out.println(results);
}

  

BeanMapHandler

BeanMapHandler也会将结果集转换为Bean对象,不过返回的是已指定列的值作为键的键值对。

@Test
public void queryByBeanMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, UserInfo> results = runner.query(conn,
"select * from USER_INFO", new BeanMapHandler<String, UserInfo>(
UserInfo.class));
System.out.println(results);
}

  

完整测试代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.BeanMapHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.After;
import org.junit.Before; public class DBUtilsTest
{
private Connection conn = null; @Before
public void initConnection() throws SQLException, ClassNotFoundException
{
printCurrentMethodName();
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
} @Before
public void initDatabase() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
runner.update(
conn,
"CREATE TABLE IF NOT EXISTS USER_INFO (userId VARCHAR(20) PRIMARY KEY, userName VARCHAR(50))");
} public void update() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
String suffix = Long.toHexString(System.currentTimeMillis());
Integer result = runner.update(conn,
"insert into USER_INFO(userId, userName) values(?, ?)", suffix,
"name" + suffix);
System.out.println("受影响记录条数:" + result);
} public void queryByScalarHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Number number = runner.query(conn, "select count(*) from USER_INFO",
new ScalarHandler<Number>());
System.out.println("总记录记录条数:" + number.intValue());
} public void queryByArrayHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Object[] results = runner.query(conn, "select * from USER_INFO",
new ArrayHandler());
System.out.println(Arrays.asList(results));
} public void queryByArrayListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Object[]> results = runner.query(conn, "select * from USER_INFO",
new ArrayListHandler());
for (Object[] object : results)
{
System.out.println(Arrays.asList(object));
}
} public void queryByKeyedHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new KeyedHandler<String>());
System.out.println(results);
} public void queryByColumnListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<String> results = runner.query(conn, "select * from USER_INFO",
new ColumnListHandler<String>());
System.out.println(results);
} public void queryByMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Object> results = runner.query(conn,
"select * from USER_INFO", new MapHandler());
System.out.println(results);
} public void queryByMapListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new MapListHandler());
System.out.println(results);
} public void queryByBeanHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
UserInfo results = runner.query(conn, "select * from USER_INFO",
new BeanHandler<UserInfo>(UserInfo.class));
System.out.println(results);
} public void queryByBeanListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<UserInfo> results = runner.query(conn, "select * from USER_INFO",
new BeanListHandler<UserInfo>(UserInfo.class));
System.out.println(results);
} public void queryByBeanMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, UserInfo> results = runner.query(conn,
"select * from USER_INFO", new BeanMapHandler<String, UserInfo>(
UserInfo.class));
System.out.println(results);
} @After
public void destory()
{
printCurrentMethodName();
DbUtils.closeQuietly(conn);
} /**
* 打印当前运行方法名称
*/
public void printCurrentMethodName()
{
System.out.println(Thread.currentThread().getStackTrace()[2]
.getMethodName());
System.out.println("==================================================");
}
}

  

https://blog.csdn.net/pdw2009/article/details/80932432

commons-dbutils使用介绍,commons-dbutils是JDBC的替代品的更多相关文章

  1. day18(JDBC事务&连接池介绍&DBUtils工具介绍&BaseServlet作用)

    day18总结 今日思维导图: 今日内容 事务 连接池 ThreadLocal BaseServlet自定义Servlet父类(只要求会用,不要求会写) DBUtils à commons-dbuti ...

  2. 黑马day12 DbUtils的介绍

    简单介绍: DbUtils为不喜欢hibernate框架的钟爱.它是线程安全的,不存在并发问题. 使用步骤: 1. QueryRunner runner=new QueryRunner(这里写数据源. ...

  3. pache—DBUtils框架简介、DbUtils类、QueryRunner类 、ResultSetHandler接口

    Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC ...

  4. 轻量级封装DbUtils&Mybatis之二Dbutils

    DbUtils入门 Apache出品的极为轻量级的Jdbc访问框架,核心类只有两个:QueryRunner和ResultSetHandler. 各类ResultSetHandler: ArrayHan ...

  5. Hive 接口介绍(Web UI/JDBC)

    Hive 接口介绍(Web UI/JDBC) 实验简介 本次实验学习 Hive 的两种接口:Web UI 以及 JDBC. 一.实验环境说明 1. 环境登录 无需密码自动登录,系统用户名shiyanl ...

  6. Notepad++使用心得和特色功能介绍 -> notepad/ultraedit的最好的替代品

    [详细]Notepad++使用心得和特色功能介绍 -> notepad/ultraedit的最好的替代品 最近在用Notepad++,发现的确是很不错的工具,具体特色,看了下面介绍就知道了. [ ...

  7. Apache Commons 工具类介绍及简单使用

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  8. Apache Commons 工具集介绍

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  9. (二十三)Dbutils 工具介绍

    目录 Dbutils简介 API 介绍 Dbutils 已实现的结果集处理器 : Dbutils简介 commons-dbutis 是Apache 组织提供的一个开源JDBC工具类库,它对JDBC进行 ...

  10. Apache Commons 工具类介绍及简单使用(转载)

    原文链接 http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动 ...

随机推荐

  1. Wing-AEP平台LWM2M设备接入

    实现Wing-AEP中国电信物联网开放平台,LWM2M设备接入 一.准备 接入模组:BC35-G 平台地址:https://www.ctwing.cn/ 点击右上角控制台 点击左侧栏点击产品中心 二. ...

  2. crontab 定时删除

    /60 * * * /bin/find /usr/local/****/****/****/****/****.log.2019* -exec rm -f {} ; >/dev/null 2&g ...

  3. 【C#】上机实验七

    .开发一个窗体应用程序,窗体上能接收华氏温度或者摄氏温度,点击相应按钮可以相互转换. 要求转换后的华氏温度或者摄氏温度保留小数点后3位,程序中要有异常处理结构. using System; using ...

  4. Java线程volatile(二)

    volatile:使变量在多个线程中可见 在java 中每个线程都会有一块工作内存区,其中存放着所有线程共享的主内存中变量的拷贝.当线程执行时,在自己的工作内存区操作这些变量,为了存取一个共享的变量, ...

  5. vs、eclips、Idea调试技巧

    vs F5:进入下一个断点 F10:不进入子函数 F11:进入子函数 Ctrl + M + O: 折叠所有方法 Ctrl + M + M: 折叠或者展开当前方法 Ctrl + M + L: 展开所有方 ...

  6. 转:深入浅出Java垃圾回收机制

    原文链接:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解G ...

  7. sql语句将图片插入image类型的字段中

    update table set photo=(SELECT * FROM OPENROWSET(BULK N'D:\no.png', SINGLE_BLOB) as Photo)    From:h ...

  8. fatal:'origin' does not appear to be a git repository fatal:Could not read from remote repository

    天gitlab中遇到的问题: 当 git push origin branch_name时遇到报错如下: fatal:'origin' does not appear to be a git repo ...

  9. [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)

    最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...

  10. Vue 默认IIS站点配置

    // Vue 默认IIS站点配置 module.exports = { baseUrl: '/SG/',  }