Apache DbUtils

原文链接:https://zhuanlan.zhihu.com/p/115169558

一、DbUtils简介

DbUtils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用DbUtils能极大简化JDBC编码的工作量,同时也不会影响程序的性能。因此DbUtils成为很多不喜欢Hibernate的公司的首选。

二、使用DbUtils

2.1、DbUtils包下载地址

http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi

2.2、基于Maven

DbUtils依赖:

 <dependency>
	<groupId>commons-dbutils</groupId>
	<artifactId>commons-dbutils</artifactId>
	<version>1.7</version>
</dependency>

三、DbUtils相关API

3.1、QueryRunner类

—— 组件的核心工具类:定义了所有与数据库操作的方法

int execute(Connection conn, String sql, Object… params) —— 执行DDL语句、存储过程调用语句等
List execute(Connection conn, String sql, ResultSetHandler rsh, Object… params) —— 执行DDL语句、存储过程调用语句等
int update(Connection conn, String sql, Object… params) —— 执行DML语句,有占位符参数
int update(Connection conn, String sql, Object params) —— 执行DML语句,只有一个占位符参数
int update(Connection conn, String sql) —— 执行DML语句,没有占位符参数
T query(Connection conn, String sql, ResultSetHandler rsh, Object… params) —— 执行DQL语句,有占位符参数
T query(Connection conn, String sql, ResultSetHandler rsh) —— 执行DQL语句,没有占位符参数

3.2、ResultSetHandler接口的实现类

BeanHandler(Class<? extends T> type) —— 查询返回单个JavaBean对象
BeanListHandler(Class<? extends T> type) —— 查询返回包含多个JavaBean对象的List集合
ArrayHandler() —— 将结果集的第一行封装为Object数组
ArrayListHandler() —— 将结果集的每一行封装为Object数组,将这些Object数组添加到List集合中返回
ScalarHandler(int columnIndex) | ScalarHandler(String columnName) —— 返回结果集中第一行某一列的值

四、DbUtils示例

4.1、DDL语句

// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();
// 2. 准备SQL语句(建表语句)
String sql = "CREATE TABLE Student(" + 
				"sno CHAR(9) PRIMARY KEY, " + 
				"sname CHAR(20), " + 
				"ssex CHAR(2), " + 
				"sage SMALLINT, " + 
				"sdept CHAR(20)" + 
				");";
// 3. 实例化QueryRunner,并执行DDL语句
QueryRunner qr = new QueryRunner();
qr.execute(conn, sql);

// 4. 关闭资源
conn.close();

4.2、DML语句

1)插入语句
// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(插入记录)
String sql = "INSERT INTO Student VALUES(?, ?, ?, ?, ?);";

// 3. 实例化QueryRunner,并执行DML语句
QueryRunner qr = new QueryRunner();
qr.update(conn, sql, "201215130", "张三", "男", 20, "IS");

// 4. 关闭资源
conn.close();
2)更新语句
// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(更新记录)
String sql = "UPDATE Student SET sname = ? WHERE sno = ?;";

// 3. 实例化QueryRunner,并执行DML语句
QueryRunner qr = new QueryRunner();
qr.update(conn, sql, "李四", "201215130");

// 4. 关闭资源
conn.close();
3)删除语句
// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(删除记录)
String sql = "DELETE FROM Student WHERE sno = ?";

// 3. 实例化QueryRunner,并执行DML语句
QueryRunner qr = new QueryRunner();
qr.update(conn, sql, "201215130");

// 4. 关闭资源
conn.close();

4.3、DQL语句

1)查询一条记录
// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(查询一条记录)
String sql = "SELECT * FROM Student WHERE sno = ?;";

// 3. 实例化一个ResultSetHandler接口的实现类(将查询结果封装为一个Student对象)
ResultSetHandler<Student> rsh = new ResultSetHandler<Student>() {
    @Override
    public Student handle(ResultSet rs) throws SQLException {
        while(rs.next()) {
        	Student student = new Student();
        	student.setSno(rs.getString("sno"));
        	student.setSname(rs.getString("sname"));
        	student.setSsex(rs.getString("ssex"));
        	student.setSage(rs.getInt("sage"));
        	student.setSdept(rs.getString("sdept"));
        	return student;
        }
        return null;
    }
};

// 4. 实例化QueryRunner,并执行DQL语句
QueryRunner qr = new QueryRunner();
Student  student = qr.query(conn, sql, rsh, "201215128");

// 5. 关闭资源
conn.close();

DbUtils已经帮我们封装了一个类似功能的ResultSetHandler接口的实现类BeanHandler,所以上面的示例也可以这样实现:

// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(查询一条记录)
String sql = "SELECT * FROM Student WHERE sno = ?;";

// 3. 实例化QueryRunner,并执行DQL语句
QueryRunner qr = new QueryRunner();
Student  student = qr.query(conn, sql, new BeanHandler<Student>(Student.class), "201215128");

// 4. 关闭资源
conn.close();

查询单条记录时,这种方式不需要我们编写ResultSetHandler接口的实现类,显然更加方便。

2)查询多条记录
// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(查询多条记录)
String sql = "SELECT * FROM Student;";

// 3. 实例化QueryRunner,并执行DQL语句
QueryRunner qr = new QueryRunner();
List<Student> list = qr.query(conn, sql, new BeanListHandler<Student>(Student.class));

// 4. 关闭资源
conn.close();

DbUtils封装了一个ResultSetHandler接口的实现类ArrayHandler,用于返回多行查询结果的第一行记录:

// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(查询多条记录)
String sql = "SELECT * FROM Student;";

// 3. 实例化QueryRunner,并执行DQL语句
QueryRunner qr = new QueryRunner();
Object[] student = qr.query(conn, sql, new ArrayHandler());
for(Object fieldValue : student) {		// 每一个fieldValue表示第一行记录的一个分量(列值)
    System.out.print(fieldValue + " ");
}

// 4. 关闭资源
conn.close();

很明显这种查询将多余的数据从数据库返回,降低了数据库查询效率,所以不推荐使用。

另外DbUtils也封装了一个ResultSetHandler接口的实现类ArrayListHandler,返回多行查询结果的所有记录,所以查询多条记录也可以这样:

// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(查询多条记录)
String sql = "SELECT * FROM Student;";

// 3. 实例化QueryRunner,并执行DQL语句
QueryRunner qr = new QueryRunner();
List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
for(Object[] student : list) {
    for(Object fieldValue : student) {
        System.out.print(fieldValue + " ");
    }
    System.out.println();
}

// 4. 关闭资源
conn.close();
3)查询聚集函数结果
// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(查询Student表的行数)
String sql = "SELECT COUNT(*) FROM Student;";

// 3. 实例化QueryRunner, 执行查询操作,返回结果集第一行某一列的值
QueryRunner qr = new QueryRunner();
Long count = qr.query(conn, sql, new ScalarHandler<Long>(1));

// 4. 关闭资源
conn.close();

4.4、调用存储过程(函数)

1)调用add函数

add函数:

使用DbUtils调用add函数:

// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(调用add函数)
String sql = "SELECT add(?, ?);";

// 3. 实例化QueryRunner, 执行查询操作
QueryRunner qr = new QueryRunner();
List<Integer> list = qr.execute(conn, sql, new ScalarHandler<Integer>(1), 100, 200);
for(Integer sum : list) {
    System.out.println(sum);	// 打印300
}

// 4. 关闭资源
conn.close();
2)调用queryStudent函数

queryStudent函数:

// 1. 获取数据库连接
Connection conn = JdbcUtils.getConnection();

// 2. 准备SQL语句(调用queryStudent函数)
String sql = "SELECT * FROM queryStudent(?)";

// 3. 实例化QueryRunner, 执行查询操作,返回结果集第一行某一列的值
QueryRunner qr = new QueryRunner();
Student student = qr.query(conn, sql, new BeanHandler<Student>(Student.class), 20);

// 4. 关闭资源
conn.close();

五、结合Spring

package aaa.bbb.ccc.config;

import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * @author zhongruhang
 */
@Configuration
public class BeanConfig {

    private final DataSource dataSource;

    @Autowired
    public BeanConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Bean
    public QueryRunner queryRunner() {
        return new QueryRunner(dataSource);
    }
}

使用的时候注入QueryRunner就可以

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值