Apache-DBUtils实现CRUD操作

简介: Apache-DBUtils实现CRUD操作

Apache-DBUtils简介

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

API介绍:

org.apache.commons.dbutils.QueryRunner org.apache.commons.dbutils.ResultSetHandler

工具类:org.apache.commons.dbutils.DbUtils API包说明:

048b21d0e4a7462db51b0fd017d11620.png

dbe9ab7cc9ed4e529fa79fa438ce63f2.png

主要API的使用

DbUtils


DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法 如下:


public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方 法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。


public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情 况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。


public static void commitAndClose(Connection conn)throws SQLException: 用来提交连接的事务, 然后关闭连接


public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在 关闭连接时不抛出SQL异常。


public static void rollback(Connection conn)throws SQLException:允许conn为null,因为方法内部做 了判断


public static void rollbackAndClose(Connection conn)throws SQLException rollbackAndCloseQuietly(Connection)


public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程 序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。


QueryRunner

该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少 编码量。


QueryRunner类提供了两个构造器: 默认的构造器 需要一个 javax.sql.DataSource 来作参数的构造器


QueryRunner类的主要方法: 更新


public int update(Connection conn, String sql, Object... params) throws SQLException:用来执行 一个更新(插入、更新或删除)操作。


......


插入


public T insert(Connection conn,String sql,ResultSetHandler rsh, Object... params) throws SQLException:只支持INSERT语句,其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys. 返回值: An object generated by the handler.即自动生成的 键值


....


批处理


public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE语句


public T insertBatch(Connection conn,String sql,ResultSetHandler rsh,Object[][] params)throws SQLException:只支持INSERT语句


.....


查询


public Object query(Connection conn, String sql, ResultSetHandler rsh,Object... params) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句 的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。


测试  

// 测试添加
@Test
public void testInsert() throws Exception {
 QueryRunner runner = new QueryRunner();
 Connection conn = JDBCUtils.getConnection3();
 String sql = "insert into customers(name,email,birth)values(?,?,?)";
 int count = runner.update(conn, sql, "何成飞", "he@qq.com", "1992-09-08");
 System.out.println("添加了" + count + "条记录");
 JDBCUtils.closeResource(conn, null);
}
// 测试删除
@Test
public void testDelete() throws Exception {
 QueryRunner runner = new QueryRunner();
 Connection conn = JDBCUtils.getConnection3();
 String sql = "delete from customers where id < ?";
 int count = runner.update(conn, sql,3);
 System.out.println("删除了" + count + "条记录");
 JDBCUtils.closeResource(conn, null);
}


ResultSetHandler接口及实现类


该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。


ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。 接口的主要实现类:


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:查询单个值对象


测试

/*
 * 测试查询:查询一条记录
 * 
 * 使用ResultSetHandler的实现类:BeanHandler
 */
@Test
public void testQueryInstance() throws Exception{
 QueryRunner runner = new QueryRunner();
 Connection conn = JDBCUtils.getConnection3();
 String sql = "select id,name,email,birth from customers where id = ?";
 //
 BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);
 Customer customer = runner.query(conn, sql, handler, 23);
 System.out.println(customer); 
 JDBCUtils.closeResource(conn, null);
}
/*
 * 测试查询:查询多条记录构成的集合
 * 
 * 使用ResultSetHandler的实现类:BeanListHandler
 */
@Test
public void testQueryList() throws Exception{
 QueryRunner runner = new QueryRunner();
 Connection conn = JDBCUtils.getConnection3();
 String sql = "select id,name,email,birth from customers where id < ?";
 //
 BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);
 List<Customer> list = runner.query(conn, sql, handler, 23);
 list.forEach(System.out::println);
 JDBCUtils.closeResource(conn, null);
}
/*
 * 自定义ResultSetHandler的实现类
 */
@Test
public void testQueryInstance1() throws Exception{
 QueryRunner runner = new QueryRunner();
 Connection conn = JDBCUtils.getConnection3();
 String sql = "select id,name,email,birth from customers where id = ?";
 ResultSetHandler<Customer> handler = new ResultSetHandler<Customer>() {
 @Override
 public Customer handle(ResultSet rs) throws SQLException {
 System.out.println("handle");
// return new Customer(1,"Tom","tom@126.com",new Date(123323432L));
 if(rs.next()){
 int id = rs.getInt("id");
 String name = rs.getString("name");
 String email = rs.getString("email");
 Date birth = rs.getDate("birth");
return new Customer(id, name, email, birth);
 }
 return null;
 }
 };
 Customer customer = runner.query(conn, sql, handler, 23);
 System.out.println(customer);
 JDBCUtils.closeResource(conn, null);
}
/*
 * 如何查询类似于最大的,最小的,平均的,总和,个数相关的数据,
 * 使用ScalarHandler
 * 
 */
@Test
public void testQueryValue() throws Exception{
 QueryRunner runner = new QueryRunner();
 Connection conn = JDBCUtils.getConnection3();
 //测试一:
// String sql = "select count(*) from customers where id < ?";
// ScalarHandler handler = new ScalarHandler();
// long count = (long) runner.query(conn, sql, handler, 20);
// System.out.println(count);
 //测试二:
 String sql = "select max(birth) from customers";
 ScalarHandler handler = new ScalarHandler();
 Date birth = (Date) runner.query(conn, sql, handler);
 System.out.println(birth);
 JDBCUtils.closeResource(conn, null);
}
相关文章
|
SQL Java 数据库连接
Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
206 0
Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
|
4月前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
48 1
|
10天前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
288 33
The Past, Present and Future of Apache Flink
|
2月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
837 13
Apache Flink 2.0-preview released
|
2月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
89 3
|
3月前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。
|
4月前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
289 2
|
4月前
|
消息中间件 分布式计算 Hadoop
Apache Flink 实践问题之Flume与Hadoop之间的物理墙问题如何解决
Apache Flink 实践问题之Flume与Hadoop之间的物理墙问题如何解决
62 3
|
4月前
|
消息中间件 运维 Kafka
Apache Flink 实践问题之达到网卡的最大速度如何解决
Apache Flink 实践问题之达到网卡的最大速度如何解决
57 2
|
4月前
|
消息中间件 前端开发 Kafka
【Azure 事件中心】使用Apache Flink 连接 Event Hubs 出错 Kafka error: No resolvable bootstrap urls
【Azure 事件中心】使用Apache Flink 连接 Event Hubs 出错 Kafka error: No resolvable bootstrap urls

热门文章

最新文章

推荐镜像

更多