【JDBC核心】commons-dbutils
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的更多相关文章
- 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...
- java JDBC (六) org.apache.commons.dbutils 增删改
dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...
- java JDBC (七) org.apache.commons.dbutils 查询
package cn.sasa.demo1; import java.sql.Connection; import java.sql.SQLException; import java.util.Li ...
- 写一个ORM框架的第一步(Apache Commons DbUtils)
新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...
- 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)
-----------------------JDBC---------- 0. db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...
- JDBC工具类-DButils(QueryRunner-ResultSetHandler)
简述: DBUtils是Java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码. DBUtils三个核心功能: QUeryRunne ...
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表
本文目录: 1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData 2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData ...
- Apache Commons DbUtils 快速上手
原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...
- Java -- JDBC 学习--使用 DBUtils
Apache—DBUtils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdb ...
- Java连接数据库 #04# Apache Commons DbUtils
索引 通过一个简单的调用看整体结构 Examples 修改JAVA连接数据库#03#中的代码 DbUtils并非是什么ORM框架,只是对原始的JDBC进行了一些封装,以便我们少写一些重复代码.就“用” ...
随机推荐
- Panda Global获悉,美国承诺4年内明确区块链数字资产监管方式!
近日,美国商品期货交易委员会(CFTC)宣布,在4年内将会全面把加密货币监管列为优先事项.Panda Global从7月8日公布的新战略中获悉,此次CFTC公布了自己接下来的新框架,并且在框架中承诺: ...
- CF1400F - x-prime Substrings
1400F - x-prime Substrings 首先发现 \(x\) 很小,所以发现对应的 x-prime 字符串数也很少,最多的情况是 \(x = 19\),有 2399 个,先爆搜出来. 现 ...
- Acwing 734. 能量石
贪心(微扰) + dp 这道题还是比较难的,前置知识: 贪心的微扰(邻项交换)证法,例题:国王游戏,耍杂技的牛 01背包 算法1:暴力\(O(T * n! * n)\) 可以\(dfs\)全排列枚举所 ...
- Hexo博客框架10分钟搭建个人博客
首先是先给大家打个招呼 最近看网上看到了很多的的关于搭建博客的视频,我自己也学着自己搭建了一个博客"我自己的博客链接"(欢迎大家来我的博客跟我深入交♂流),今天我把搭建的过程记录下 ...
- Vue--子组件互相传值,子组件来回传值,传值反复横跳
Vue--子组件传值,子组件来回传值,子组件传值反复横跳 我不不仅要子组件之间直接传值,我还要传过去再传回来,传回来再传过去,子组件直接反复横跳 解决问题 给组件传值,并不知道改值的校验结果 同一个组 ...
- 【面试专栏】Java并发编程:volatile关键字
1. 内存模型 若一个变量在多线程环境下同时操作,则可能出现结果不一致的情况.这就是常说的缓存不一致性问题. 解决缓存不一致问题,通常有两个解决方案: 通过在总线加LOCK#锁的方式 因为CPU和其 ...
- JVM虚拟机(三):Java内存区域
运行时数据区 Java虚拟机再执行Java程序过程中会把它所管理的内存划分为若干个不同分工的数据区域. 程序计数器 程序计数器时一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示 ...
- 01-flask-helloWorld
代码 from flask import Flask # 创建Flask对象 app = Flask(__name__) # 定义路由 @app.route('/') def index(): # 函 ...
- css进阶 04-如何让一个元素水平垂直居中?
04-如何让一个元素水平垂直居中? #前言 老板的手机收到一个红包,为什么红包没居中? 如何让一个子元素在父容器里水平垂直居中?这个问题必考,在实战开发中,也应用得非常多. 你也许能顺手写出好几种实现 ...
- 旁站和C段的简要解释
旁注与C段嗅探的意义,旁注的意思就是从同台服务器上的其他网站入手,提权,然后把服务器端了,就自然把那个网站端了.C段嗅探,每个IP有ABCD四个段,举个例子,192.168.0.1,A段就是192,B ...