Java 中Apache-DBUtils类的使用详解
Posted 路宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 中Apache-DBUtils类的使用详解相关的知识,希望对你有一定的参考价值。
博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
👉点击跳转到网站
前言:
问题引出:关闭Connection后,ResultSet结果集无法使用,ResultSet结果集不利于数据的管理。
具体看下面的示意图
一、首先用自己的方法把ResultSet结果集封装到ArrayList集合中
代码如下
public class JDBCUtilsByDruid_Use
//自己封装解决将ResultSet 封装到ArrayList中
@Test
public ArrayList<Actor> testSelectToArrayList()
Connection connection = null;
String sql = "SELECT id,name,borndate,sex,phone FROM ACTOR WHERE id >= ?";
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
ArrayList<Actor> list = new ArrayList<>();//创建ArrayList对象,存放Actor对象
try
//1.得到连接
connection = JDBCUtilsByDruid.getConnection();
System.out.println(connection.getClass());//class com.alibaba.druid.pool.DruidPooledConnection
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 2);
//执行得到结果集
resultSet = preparedStatement.executeQuery();
while (resultSet.next())
String name = resultSet.getString("name");
String phone = resultSet.getString("phone");
int id = resultSet.getInt("id");
Date borndate = resultSet.getDate("borndate");
String sex = resultSet.getString("sex");
//把得到的resultSet的记录,封装到Actor对象,放入到List集合
list.add(new Actor(id, name, sex, borndate, phone));
System.out.println("list集合数据=" + list);
for (Actor actor : list)
System.out.println(actor.getSex());
catch (Exception e)
e.printStackTrace();
finally
JDBCUtilsByDruid.close(resultSet, preparedStatement, connection);
//因为ArrayList和Connection没有任何关联,所以该集合可以复用
return list;
二、使用Apache组织提供的一个开源JDBC工具库,它是对JDBC的封装,使用DBUtils能极大简化jdbc编码的工作量。
1、Apache-DBUtils的基本介绍
commons-dbutils-1.7.jar包的下载
下载对应的jar包即可
2、演示apache-DBUtils 工具类的使用
public class DBUtils_USE
//使用apache-DBUtils 工具类 + druid 完成对表的crud操作
@Test
public void testQueryMany() throws SQLException //返回结果是多行的情况
Connection connection = JDBCUtilsByDruid.getConnection();
//使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
//1.创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//2.就可以执行相关的方法,返回ArrayList结果集
// String sql = "SELECT * FROM ACTOR WHERE id >= ?";
//注意:sql语句 也可以查询部分列
String sql = "SELECT id,name FROM ACTOR WHERE id >= ?";
//解读:
//1.query方法就是执行sql语句,得到resultSet --封装到-->ArrayList集合中
//2.返回集合
//3.connection:连接
//4.sql:执行sql语句
//5.new BeanListHandler<>(Actor.class):在将resultSet ->Actor对象->封装到ArrayList中
//底层使用反射机制,去获取Actor类的属性,进行封装
//6. 1 就是给sql语句中的?号赋值的,可以有多个值,因为是可变参数 Object... params
//7.底层得到的resultSet,会在query()方法关闭,prepareStatement关闭
/**
* 分析:queryRunner.query方法
* private <T> T query(Connection conn, boolean closeConn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException
* if (conn == null)
* throw new SQLException("Null connection");
* else if (sql == null)
* if (closeConn)
* this.close(conn);
*
*
* throw new SQLException("Null SQL statement");
* else if (rsh == null)
* if (closeConn)
* this.close(conn);
*
*
* throw new SQLException("Null ResultSetHandler");
* else
* PreparedStatement stmt = null; //定义PreparedStatement
* ResultSet rs = null; //接收返回的ResultSet
* Object result = null; //返回ArrayList
*
* try
* stmt = this.prepareStatement(conn, sql); //创建PreparedStatement
* this.fillStatement(stmt, params); //对SQL 进行? 赋值
* rs = this.wrap(stmt.executeQuery());//执行sql,返回resultSet
* result = rsh.handle(rs); //返回的resultSet-->arrayList[resultSet][使用反射,对传入的class对象处理]
* catch (SQLException var33)
* this.rethrow(var33, sql, params);
* finally
* try
* this.close(rs);//关闭resultSet
* finally
* this.close(stmt); //关闭PrepareStatement
* if (closeConn)
* this.close(conn);
*
*
*
*
*
* return result;
*
*
*/
List<Actor> list = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);
System.out.println("输出集合的信息");
for (Actor actor : list)
System.out.println(actor);
//释放资源
JDBCUtilsByDruid.close(null, null, connection);
//使用apache-DBUtils 工具类 + druid 完成 返回的结果是单行记录(单个对象)
@Test
public void testQuerySingle() throws Exception
Connection connection = JDBCUtilsByDruid.getConnection();
//使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
//1.创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//2.就可以执行相关的方法,返回单个对象
String sql = "SELECT * FROM ACTOR WHERE id = ?";
//解读:
//因为我们返回的单行记录<-->单个对象,使用的Handler是BeanHandler
Actor actor = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class), 3);
System.out.println(actor);
//释放资源
JDBCUtilsByDruid.close(null, null, connection);
//使用apache-DBUtils 工具类 + druid 完成查询结果是单行单列-返回的就是object
@Test
public void testScaler() throws Exception
Connection connection = JDBCUtilsByDruid.getConnection();
//使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
//1.创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//2.就可以执行相关的方法,返回单行单列,返回的就是Object
String sql = "SELECT name FROM ACTOR WHERE id = ?";
//解读:
//因为我们返回的单行记录<-->单个对象,使用的Handler是BeanHandler
//解读:因为返回的是一个对象,使用的handler就是ScalarHandler
Object object = queryRunner.query(connection, sql, new ScalarHandler(), 3);
System.out.println(object);//周润发
//释放资源
JDBCUtilsByDruid.close(null, null, connection);
//使用apache-DBUtils 工具类 + druid 完成DML操作(insert,delete,update)
@Test
public void testDML() throws Exception
//1.得到连接(druid)
Connection connection = JDBCUtilsByDruid.getConnection();
//2使用DBUtils类和接口,放入DBUtils相关的jar,放入到本Project
//3.创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//4.这里组织sql完成update,insert,delete
// String sql = "UPDATE ACTOR SET NAME=? WHERE id = ?";
// String sql = "INSERT INTO ACTOR VALUES(NULL,?,?,?,?)";
String sql = "DELETE FROM ACTOR WHERE id = ?";
//解读:
//1.执行DML 操作是queryRunner.update()
//2.返回的值是受影响的行数
// int affectedRow = queryRunner.update(connection, sql, "张无忌", "男", "1979-01-01", "123456");
int affectedRow = queryRunner.update(connection, sql, 4);
System.out.println(affectedRow > 0 ? "执行成功" : "执行没有影响到表");//执行成功
//释放资源
JDBCUtilsByDruid.close(null, null, connection);
以上是关于Java 中Apache-DBUtils类的使用详解的主要内容,如果未能解决你的问题,请参考以下文章
JAVA JDBC Apache-DBUtils实现CRUD操作