一、概述
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能
和jsbcTemplate的功能和作用相同
二、DbUtils使用步骤
1.导包
2.核心类: QueryRunner
构造方法:----->可以查看api使用,
|
QueryRunner() : 连接需要开发者自己管理连接对象,可以进行事务控制 QueryRunner(DataSource ds) : 创建核心类对象的时候,需要一个连接池对象,工具会帮我们管理连接,但是不能 进行事务控制
|
成员方法:
query() : 就是用来做查询操作
query(String sql, ResultSetHandler<T> rsh, Object... params)
参数说明:
Sql : sql语句
ResultSetHandler : 结果集处理类
可变参数params
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
参数说明:
conn:链接对象
Sql : sql语句
ResultSetHandler : 结果集处理类
可变参数params
update() : 就是用来做增删改操作
update(Connection conn, String sql, Object... params)
update(String sql, Object... params)
3.ResultSetHandler接口的子实现类(只需要修改ResultSetHandler<T> rsh参数即可实现不同的返回)
|
ArrayHandler : 将单个结果集数据封装为数组 ArrayListHandler : 将查询到的多条数据封装为集合对象里面的每一条数据封装为数组 |
|
BeanHandler : 将查询到的单条数据封装为javabean对象 BeanListHandler : 将查询到的多条数据封装为集合对象,里面的每一条数据封装为javabean对象 |
|
ColumnListHandler : 将查询到的单列数据封装为集合对象 |
|
MapHandler : 将查询到的单条数据封装为map集合对象 Key : 存储的是列名 Value : 存储的是列对应的值 MapListHandler : 将查询到的多条数据封装为list集合,里面的每一条数据封装为map集合 |
|
ScalarHandler : 将查询到的单个结果进行封装 |
示例:
user表
CREATE TABLE `user` (
`username` VARCHAR(20) NOT NULL,
`password` VARCHAR(20) NOT NULL,
`id` INT(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
user类
private String username;
private String password;
private int id;
dbutils操作
package com.itheima;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource;
import com.itheima.domain.User;
import com.itheima.utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class DBUtilsDemo {
@Test
/**
* 给数据库添加数据
*/
public void insert() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "insert into user values (?,?,null)";
//3,执行sql语句
int update = runner.update(sql, "zhangsan","123456");
System.out.println(update);//返回值是影响的行数
}
/**
* 修改的功能
*/
@Test
public void update() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "update user set username = ? where id = ?";
//3,执行sql语句
int lisi = runner.update(sql, "lisi", 1);
System.out.println(lisi);
}
/**
* 删除数据的功能
*/
@Test
public void delete() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "delete from user where id = ?";
//3,执行sql语句
int update = runner.update(sql, 1);
System.out.println(update);
}
-----------------------------以上是update(增删改方法)----------------------------------------------->
-----------------------------下面是query(查询方法)-------------------------------------------------->
/**
* 查询单条数据
* 自己实现ResultSetHandler接口
*/
@Test
public void findOne() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select * from user where id = ?";
//3,执行sql语句
User user = runner.query(sql, new ResultSetHandler<User>() {
public User handle(ResultSet resultSet) throws SQLException {
/**
* 参数
* ResultSet: 查询结果封装的对象
* 返回值:
* 真正返回给使用者的对象
*/
//1,创建User对象
User user = new User();
//将resultSet结果集中的数据封装到user对象中
//1,判断resultset结果集中是否有数据
if(resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
//2,将获取到的字段值设置到user对象中
user.setId(id);
user.setUsername(username);
user.setPassword(password);
}
return user;
}
}, 2);
System.out.println(user);
}
-------------以上为自己实现ResultSetHandler接口,了解即可,开发中不会用,以下是重要--------------------->
/**
*
* 查询单条数据BeanHandler
*/
@Test
public void findUserToBean() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select * from user where id = ?";
//3,执行sql语句
User user = runner.query(sql, new BeanHandler<User>(User.class), 2);
System.out.println(user);
}
/**
* 查询多条数据 BeanListHandler
*/
@Test
public void findUsers2List() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select * from user";
//3,执行sql语句
List<User> list = runner.query(sql, new BeanListHandler<User>(User.class));
for (User user : list) {
System.out.println(user);
}
}
/**
* MapHandler 查询单条数据
*/
@Test
public void findOneToMap() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select * from user where id = ?";
//3,执行sql语句
Map<String, Object> map = runner.query(sql, new MapHandler(), 2);
//4,变量map集合
Set<String> keys = map.keySet();
for (String key : keys) {
//根据key获取value
Object value = map.get(key);
System.out.println(key + "==" + value);
}
}
/**
* 查询多条数据 MapListHandler
*/
@Test
public void findUsersToMapList() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select * from user";
//3,执行sql语句
List<Map<String, Object>> list = runner.query(sql, new MapListHandler());
//4,遍历
for (Map<String, Object> map : list) {
Set<Map.Entry<String, Object>> entries = map.entrySet();
Iterator<Map.Entry<String, Object>> it = entries.iterator();
while(it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + "==" + value);
}
System.out.println("--------------------------");
}
}
/**
* 查询单列数据 ColumnListHandler
*/
@Test
public void findColumn() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select username from user";
//3,执行sql语句
List<Object> list = runner.query(sql, new ColumnListHandler());
System.out.println(list);
}
@Test
public void findColumn1() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select * from user";
//3,执行sql语句
List<Object> list = runner.query(sql, new ColumnListHandler("password"));
System.out.println(list);
}
/**
* 查询单个结果 ScalarHandler,一般用于聚合函数查出来的结果
*/
@Test
public void find() throws SQLException {
//1,创建核心类对象(执行sql语句的引擎)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
//2,编写sql语句
String sql = "select count(*) from user";
//3,执行sql语句
Object count = runner.query(sql, new ScalarHandler());
System.out.println(count);
}
-----------------上面所有都是通过工具来管理连接池(JDBCUtils.getDataSource())------------------------>
// 通过连接来对象来操作,QueryRunner runner = new QueryRunner();,不需要传递参数,可以进行事务控制
@Test
public void find1() throws SQLException {
//1,创建sql语句执行引擎
QueryRunner runner = new QueryRunner();
//2,编写sql语句
String sql = "select * from user where id = ?";
//3,执行sql语句
//获取连接
Connection conn = JDBCUtils.getConnection();
User user = runner.query(conn, sql, new BeanHandler<User>(User.class), 3);
System.out.println(user);
}
}