commons-dbutils

简介

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

主要类:

  • QueryRunner:提供数据库操作的一些重载的 update()query() 方法;
  • ResultSetHandler:此接口用于处理数据库查询结果得到的结果集,不同的结果集有不同的子类实现;
  • DbUtils:提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类,里面的所有方法都是静态的。

使用

QueryRunner 类

  • 该类简化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量**。
  • 该类提供了两个构造器:
    • 默认的构造器;
    • 需要一个 javax.sql.DataSource 来作参数的构造器;
  • 主要方法:
    • 更新

      • public int update(Connection conn, String sql, Object... params) throws SQLException 用来执行一个更新(插入、更新或删除)操作。
    • 插入
      • public <T> T insert(Connection conn,String sql,ResultSetHandler<T> rsh, Object... params) throws SQLException 只支持插入操作。
    • 批处理
      • public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException 插入、更新或删除操作。
      • public <T> T insertBatch(Connection conn,String sql,ResultSetHandler<T> rsh,Object[][] params)throws SQLException 只支持插入操作。
    • 查询
      • public Object query(Connection conn, String sql, ResultSetHandler rsh,Object... params) throws SQLException 执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

ResultSetHandler 接口

  • 该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式;
  • 主要实现类:
    • ArrayHandler 把结果集中的第一行数据转成对象数组。
    • ArrayListHandler 把结果集中的每一行数据都转成一个数组,再存放到 List 中。
    • BeanHandler 将结果集中的第一行数据封装到一个对应的 JavaBean 实例中。
    • BeanListHandler 将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中,存放到List里。
    • ColumnListHandler 将结果集中某一列的数据存放到 List 中。
    • KeyedHandler(name):将结果集中的每一行数据都封装到一个 Map 里,再把这些 map 再存到一个 map 里,其 key 为指定的 key。
    • MapHandler 将结果集中的第一行数据封装到一个 Map 里,key 是列名,value 就是对应的值。
    • MapListHandler 将结果集中的每一行数据都封装到一个 Map里,然后再存放到 List。
    • ScalarHandler 查询单个值对象。
package cn.parzulpan.jdbc.ch09;

import cn.parzulpan.jdbc.bean.Customer;
import cn.parzulpan.jdbc.util.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test; import java.sql.Connection;
import java.sql.Date;
import java.sql.SQLException;
import java.util.List;
import java.util.Map; /**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : DBUtils QueryRunner 使用
*/ public class QueryRunnerTest { // 插入记录
@Test
public void testInsert() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner();
String sql = "insert into customers(name,email,birth)values(?,?,?)";
int update = queryRunner.update(connection, sql, "劲儿", "jiner@163.com", "1995-12-29");
System.out.println("添加了 " + update + " 条记录");
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} // 删除记录
@Test
public void testDelete() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner();
String sql = "delete from customers where id < ?";
int update = queryRunner.update(connection, sql, 3);
System.out.println("删除了 " + update + " 条记录");
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} // 修改记录
@Test
public void testUpdate() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner();
String sql = "update customers set email = ? where name = ?";
int update = queryRunner.update(connection, sql, "jinerR@163.com", "劲儿");
System.out.println("修改了 " + update + " 条记录");
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} // 查询一条记录,BeanHandler
@Test
public void testQuery() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner();
String sql = "select id,name,email,birth from customers where id = ?";
// BeanHandler 是 ResultSetHandler 的实现类,用于封装表中的一条记录
BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);
Customer customer = queryRunner.query(connection, sql, handler, 23);
System.out.println(customer); // Customer{id=23, name='劲儿', email='jinerR@163.com', birth=1995-12-29}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} // 查询一条记录,MapHandler
@Test
public void testQueryMap() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner();
String sql = "select id,name,email,birth from customers where id = ?";
MapHandler mapHandler = new MapHandler();
Map<String, Object> map = queryRunner.query(connection, sql, mapHandler, 23);
System.out.println(map); // {name=劲儿, birth=1995-12-29, id=23, email=jinerR@163.com}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} // 查询多条记录,BeanListHandler
@Test
public void testQueryList() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner();
String sql = "select id,name,email,birth from customers where id < ?";
BeanListHandler<Customer> listHandler = new BeanListHandler<>(Customer.class);
List<Customer> customerList = queryRunner.query(connection, sql, listHandler, 13);
customerList.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} // 查询多条记录,MapListHandler
@Test
public void testQueryMapList() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner();
String sql = "select id,name,email,birth from customers where id < ?";
MapListHandler mapListHandler = new MapListHandler();
List<Map<String, Object>> mapList = queryRunner.query(connection, sql, mapListHandler, 13);
mapList.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} // 查询特殊值,类似于最大的,最小的,平均的,总和,个数相关的数据,ScalarHandler
@Test
public void testQueryScalar() {
Connection connection = null;
try {
connection = JDBCUtils.getDruidConnection(); QueryRunner queryRunner = new QueryRunner(); String sql = "select count(*) from customers where id < ?";
ScalarHandler scalarHandler = new ScalarHandler();
Object query = queryRunner.query(connection, sql, scalarHandler, 20);
System.out.println(query); String sql1 = "select max(birth) from customers";
ScalarHandler handler = new ScalarHandler();
Object query1 = queryRunner.query(connection, sql1, handler);
System.out.println(query1); } catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection, null);
}
} }

练习和总结

【JDBC核心】commons-dbutils的更多相关文章

  1. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  2. java JDBC (六) org.apache.commons.dbutils 增删改

    dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...

  3. java JDBC (七) org.apache.commons.dbutils 查询

    package cn.sasa.demo1; import java.sql.Connection; import java.sql.SQLException; import java.util.Li ...

  4. 写一个ORM框架的第一步(Apache Commons DbUtils)

    新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...

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

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

  6. JDBC工具类-DButils(QueryRunner-ResultSetHandler)

    简述: DBUtils是Java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码. DBUtils三个核心功能: QUeryRunne ...

  7. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  8. Apache Commons DbUtils 快速上手

    原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...

  9. Java -- JDBC 学习--使用 DBUtils

    Apache—DBUtils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdb ...

  10. Java连接数据库 #04# Apache Commons DbUtils

    索引 通过一个简单的调用看整体结构 Examples 修改JAVA连接数据库#03#中的代码 DbUtils并非是什么ORM框架,只是对原始的JDBC进行了一些封装,以便我们少写一些重复代码.就“用” ...

随机推荐

  1. box-sizing什么时候用?常用的值都有什么?

    一般在做自适应的网页设计的时候用,用这个属性网页结构才不会被破坏. 常用的值: 1.  content-box:宽度和高度分别应用到元素的内容框,在宽度和高度之外绘制元素的内边距和边框. 2.  bo ...

  2. 重庆聚焦区块链应用,Panda Global觉得春天真的来了!

    近日,由2020中国智博会组委会主办.重庆市大数据应用发展管理局与渝中区人民政府联合承办.重庆市区块链应用创新产业联盟和四川省区块链行业协会联合执行的"2020线上智博会区块链应用创新大赛& ...

  3. golang omitempty 总结

    golang omitempty 总结 在使用Golang的时候,不免会使用Json和结构体的相互转换,这时候常用的就是 json.Marshal和json.Unmarshal两个函数. 这时候在定义 ...

  4. 题解-[WC2011]最大XOR和路径

    [WC2011]最大XOR和路径 给一个 \(n\) 个点 \(m\) 条边(权值为 \(d_i\))的无向有权图,可能有重边和子环.可以多次经过一条边,求 \(1\to n\) 的路径的最大边权异或 ...

  5. jwt与springcloud联用

    图片来源与博客:https://www.jianshu.com/p/99a458c62aa4 分布式权限管理参考:https://blog.csdn.net/qq_36236890/article/d ...

  6. react项目中的一些配置

    react中事件优化使用babel插件 npm install babel-plugin-react-scope-binding --save-dev react中绝对路径引入文件:在根目录下增加js ...

  7. Service Cloud 零基础(二)Knowledge浅谈

    本篇参考:https://trailhead.salesforce.com/content/learn/projects/set-up-salesforce-knowledge https://tra ...

  8. linux环境下jdk安装以及配置

    linux 环境安装jdk和配置环境变量: (此处以root用户安装,此方式安装一台虚拟机装一个jdk即可,所有普通用户可以共用) 1.下载安装jdk 链接: https://pan.baidu.co ...

  9. 探究 position-sticky 失效问题

    CSS 的 position 值中,有一个非常有用的值 -- position: sticky,通常会被用于各种吸顶,吸底,吸边的效果中. 如果你对 sticky 还不太熟悉,可以先看看我的这篇文章: ...

  10. MPEG2TS文件格式概述

    总结TS文件格式,早在几个月前就有了这个想法,但一直拖到今天才真正准备写一篇博文来介绍. 再不介绍的话,估计几月后又要去故纸堆里翻东西了,毕竟个人笔记中总结记录的东西太多,搞不好哪天给意外弄丢了. 1 ...