1、commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

2、相关API:

--org.apache.commons.dbutils.QueryRunner

--org.apache.commons.dbutils.ResultSetHandle

--工具类:org.apache.commons.dbutils.DbUtils

3、使用QueryRunner进行更新操作:

--update方法:可执行delete,insert,update的sql语句

public void testQueryRunner_update(){
Connection conn = null;
//创建QueryRunner的实现类
QueryRunner queryRunner = new QueryRunner();
String sql = "DELETE FROM customers WHERE id > ?"; try{
//获取数据库连接
conn = JDBCUtils.getConnection();
//调用QueryRunner的update方法实现更新操作
int rows = queryRunner.update(conn, sql, 97);
System.out.println(rows + "rows deleted.");
}catch(Exception e){
e.printStackTrace();
}finally{
//释放数据库资源
JDBCUtils.release(conn, null, null);
}
}

4、使用QueryRunner进行查询操作:

--使用QuneryRunner的query()方法进行查询时,需要传入对应的ResultSetHandler的实现类对象以完成对结果集的处理,其返回类型取决于ResultSetHandler中handle方法的返回类型,可以使用以下几种ResultSetHandler:

--1)自定义结果集处理:

/**
*自定义ResultSetHandler,并重写handle方法,对结果集进行处理
*/
class MyResultSetHandler implements ResultSetHandler{
@Override
public Object handle(ResultSet rs) throws SQLException {
List<Customer> list = new ArrayList<>();
while(rs.next()){
BigDecimal id = rs.getBigDecimal(1);
String name = rs.getString(2);
Date birth = rs.getDate(3); Customer customer = new Customer(id, name, birth);
list.add(customer);
}
return list;
} } @Test
public void testResultSetHandler(){
Connection conn = null;
QueryRunner queryRunner = new QueryRunner();
try{
conn = JDBCUtils.getConnection();
String sql = "SELECT id \"id\", name \"name\", birth \"birth\" FROM customers where id < 5";
Object customers = queryRunner.query(conn, sql,
new MyResultSetHandler()); System.out.println(customers);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(conn, null, null);
}
}

--源码分析queryRunner.query()方法

 public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh,Object... params) throws SQLException {
PreparedStatement stmt = null;
ResultSet rs = null;
T result = null;
try {
stmt = this.prepareStatement(conn, sql);
this.fillStatement(stmt, params);
rs = this.wrap(stmt.executeQuery());
result = rsh.handle(rs);
} catch (SQLException e) {
this.rethrow(e, sql, params);
} finally {
try {
close(rs);
} finally {
close(stmt);
}
}
return result;
}

上面的方法中,在获取到结果集之后(第8行),将调用传入的ResultSetHandler对象的handle方法对结果集处理(第9行),这里将调用自定义的实现类中的handle方法。

--2)BeanHandler:将查询的结果集的第一条记录转化为传入的对应的class类的对象并返回:

 Customer customer = queryRunner.query(conn, sql,new BeanHandler(Customer.class));
System.out.println(customer);

--3)BeanListHandler:将查询的结果集转化为传入的对应的class类的对象列表并返回:

 List<Customer> customers = queryRunner.query(conn, sql,new BeanListHandler(Customer.class));
System.out.println(customers);

--4)MapHandler:将查询的结果集的第一条记录转化为Map并返回,其中key值对应列名,value对应列的值:

 Map<String, Object> customer = queryRunner.query(conn, sql,new MapHandler());
System.out.println(customer);

--5)MapLsitHandler:将查询的结果集转化为MapList并返回,其中key值对应列名,value对应列的值:

List<Map<String, Object>> customers = queryRunner.query(conn, sql,new MapListHandler());
System.out.println(customers);

--6)ScalarHandler:将结果集的第一行第一列转化的数据成数值(可以是基础类型、String类和Date类):

String sql = "SELECT name FROM customers WHERE id = 5";
String name = (String)queryRunner.query(conn, sql,new ScalarHandler());
System.out.println(name);

JDBC--DBUtils的使用的更多相关文章

  1. 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)

    -----------------------JDBC---------- 0.      db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...

  2. 使用JDBC(Dbutils工具包)来从数据库拿取map类型数据来动态生成insert语句

    前言: 大家在使用JDBC来连接数据库时,我们通过Dbutils工具来拿取数据库中的数据,可以使用new BeanListHandler<>(所映射的实体类.class),这样得到的数据, ...

  3. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

    最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...

  4. jdbc操作mysql

    本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...

  5. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)

    近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...

  6. Android 之JDBC

    JDBC(Java DataBase Connectivity)是使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待,实现数据库无关的 Java操作 ...

  7. 厚积薄发系列之JDBC详解

    创建一个以JDBC链接数据库的程序,包含七个步骤 1.加载JDBC驱动 加载要连接的数据库的驱动到JVM 如何加载?forName(数据库驱动) MySQL:Class.forName("c ...

  8. JdbcUtils.java

    package com.jdbc.dbutils; import java.lang.reflect.Field; import java.sql.Connection; import java.sq ...

  9. 32、mybatis

    第一章回顾jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建 ...

  10. mybaits入门

    1.回顾jdbc开发 orm概述 orm是一种解决持久层对象关系映射的规则,而不是一种具体技术.jdbc/dbutils/springdao,hibernate/springorm,mybaits同属 ...

随机推荐

  1. Python:列表类型

    概念 列表:有序的,可变的,元素集合 因为列表和字符串都是序列类型,所以很多操作和字符串很相似 但是注意:列表是可变类型,字符串是不可变类型 定义 基本定义 定义方法:[ 元素1, 元素2, .... ...

  2. JDBC statement的常用方法

    Statement接口: 用于执行静态SQL语句并返回它所生成结果的对象. 三种Statement类: Statement: 由createStatement创建,用于发送简单的SQL语句(最好是不带 ...

  3. Vim:Vim入门级配置

    转:https://vimjc.com/vimrc-config.html Vim配置文件.vimrc Vim编辑器相关的所有功能开关都可以通过.vimrc文件进行设置. .vimrc配置文件分系统配 ...

  4. ZOJ1004 Anagrams by Stack

    题目大意:规定 i 为入栈,o 为出栈,现在给两个字符串st1,st2,现在要将st1转化为st2,转化方法是,st1中字符从头开始入栈,并合理出栈构造出st2.请输出所有可能的出入栈步骤. 深度优先 ...

  5. 洛谷P1060开心的金明(滚动数组优化)

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行”. ...

  6. kafka创建topic报错

    kafka执行如下创建topic的语句: [root@node01 kafka_2.11-1.0.0]# bin/kafka-topics.sh --create --topic streaming- ...

  7. opencv人脸识别提取手机相册内人物充当数据集,身份识别学习(草稿)

    未写完 采用C++,opencv+opencv contrib 4.1.0 对手机相册内人物opencv人脸识别,身份识别学习 最近事情多,介绍就先不介绍了 photocut.c #include & ...

  8. HHR计划---作业复盘-直播第三课

    一,出租车广告: 1,三个点不合格:周期太长了,大而全互联网产品,不符合MVP原则:业务关键点丢掉了:没有业务认知和成长. 2,关键假设: (1)车主有没有需求呀,画像怎么样? (2)车主收入如何,能 ...

  9. 2.2 logistic回归

    logistic回归,是一个学习算法,用在监督学习问题中, 输出标签y是0或者1的时候,这是一个二元分类问题, 给定一个输入x,一张图,你希望识别出这是不是猫图, 需要一个算法,可以给出一个预测值,我 ...

  10. postgres语句

    select DISTINCT lxbh from "20190816183245_ld_lxbh_2018" WHERE CHAR_LENGTH("lxbh" ...