Apache组织提供的一个对JDBC进行简单封装的开源工具库,能简化JDBC的开发,同时也不影响程序性能。
就是对JDBC的简单封装
因为JDBC手写比较麻烦,且有很多代码是类似的,比如获得链接、预编译SQL、释放资源等
可以将这些代码抽取出来放到工具类中,将类似的代码进行抽取,大大简化UJDBC的编程
参考文档:点击打开
QueryRunner对象:核心运行类QueryRunner()
QueryRunner( DataSource ds)##增删改
update(String sql, Object... params)
update(Connection conn, String sql, Object... params)
##执行查询
query(String sql, ResultSetHandler<T> rsh, Object... params)
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) 一般情况下,如果执行CRUD的操作时:
构造:
QueryRunner(DataSource ds);
方法:
int update(String sql,Object ... args);
T query(String sql,ResultSetHandler rsh,Object...args);如果有事务管理的话使用另一套完成CRUD操作
构造:
QueryRunner();
方法:
int update(Connection conn,String sql,Object ... args);
T query(Connection conn,String sql,ResultSetHandler rsh,Object...args);batch(Connection conn, String sql, Object[][] params)
batch(String sql, Object[][] params) commitAndCloseQuietly(Connection conn)
rollbackAndCloseQuietly(Connection conn)
##安静关闭指的是同时把异常处理掉/**
* 添加操作
*/
@Test
public void demo1() throws SQLException {
// 创建核心类:QueryRunner
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
queryRunner.update("insert into account values (null,?,?)", "ddd", 10000);
}/**
* 修改操作
* @throws SQLException
*/
@Test
public void demo2() throws SQLException {
// 创建核心类:QueryRunner
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
queryRunner.update("update account set name =? ,money =? where id = ?", "eee",20000,4);
}/**
* 删除操作
* @throws SQLException
*/
@Test
public void demo3() throws SQLException {
//创建核心类
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
queryRunner.update("delete from account where id =?", 3);
}Account.java package com.itheima.DBUtils.domain;
/**
* 用于存储在数据库中查询到的信息
* */
public class Account {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
private String name;
private Double money;
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", money=" + money + "]";
}
}DBUtilsDemo2.java,实现如下package com.itheima.DBUtils.demo2;
/**
* DBUtils的查询操作
* */
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.junit.Test;
import com.itheima.DBUtils.domain.Account;
import com.itheima.jdbc.utils.JDBCUtils2;
import com.mchange.v2.c3p0.impl.NewPooledConnection;
public class DBUtilsDemo2 {
/**
* 查询1:查询1条记录的操作
* @throws SQLException
* */
@Test
public void demo1() throws SQLException {
//创建核心类
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
//执行查询
Account account = queryRunner.query("select * from account where id =?", new ResultSetHandler<Account>() {
@Override
public Account handle(ResultSet rs) throws SQLException {
Account account = new Account();
if (rs.next()) {
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getDouble("money"));
}
return account;
}
}, 1);
System.out.println(account);
}
/**
* 查询2:查询多条记录的操作
* @throws SQLException
* */
@Test
public void demo2() throws SQLException {
//创建核心类
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
//执行查询
List<Account> list = queryRunner.query("select * from account", new ResultSetHandler<List<Account>>() {
@Override
public List<Account> handle(ResultSet rs) throws SQLException {
//创建一个集合用于封装数据
List<Account> list = new ArrayList<Account>();
while (rs.next()) {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getDouble("money"));
//将对象存入到list集合
list.add(account);
}
return list;
}
});
//将集合中的数据输入(遍历)
for (Account account : list) {
System.out.println(account);
}
}
}DBUtils的ResultSetHandler实现类1— ArrayHandler和ArrayListHandler ArrayHandler是将一条记录封装到一个数组当中,这个数组是Object[]ArrayListHandler是将多条记录封装到一个装有一个 Object[] 的list集合中ArrayHandler实现查询一条记录 /**
* ArrayHandler:将一条记录封装到一个Object数组中
* @throws SQLException
* */
@Test
public void demo1() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
Object[] objs = queryRunner.query("select * from account where id =?", new ArrayHandler(), 1);
System.out.println(Arrays.toString(objs));
}ArrayListHandler 实现查询多条记录 /**
* ArrayListHandler:将多条数据封装到一个装有Object数组的List数组中
* 一条记录封装到Object[]数组中,多条记录就是多个Object[],那么多个Objecy数组就将其装入List集合中
* @throws SQLException
* */
@Test
public void demo2() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
List<Object[]> list = queryRunner.query("select * from account", new ArrayListHandler());
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
}DBUtils的ResultSetHandler实现类2—BeanHandler和BeanListHandlerBeanHandler:将一条记录封装到一个JavaBean中BeanListHandler:将多条记录封装到一个装有JavaBean的List集合中BeanHandler:将一条记录封装到一个JavaBean中/**
* BeanHandler:将一条记录封装到一个JavaBean中
* @throws SQLException
* */
@Test
public void demo3() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
Account account = queryRunner.query("select * from account where id = ?", new BeanHandler<Account>(Account.class), 2);
System.out.println(account);
}BeanListHandler:将多条记录封装到一个JavaBean的List集合中/**
* BeanListHandler:将多条记录封装到一个JavaBean的List集合中
* 一条记录就是一个Java的对象(JavaBean),如果是多条记录(多个Java对象),将多个Java对象装到一个List集合中
* @throws SQLException
* */
@Test
public void demo4() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
List<Account> list = queryRunner.query("select * from account", new BeanListHandler<Account>(Account.class));
for (Account account : list) {
System.out.println(account);
}
}DBUtils的ResultSetHandler实现类3—MapHandler和MapListHandlerMapHandler:将一条记录封装到一个Map集合中,Map的key是列名,Map的value是表中列的记录值BeanListHandler:将多条记录封装到一个装有Map的List集合中MapHandler /**
* MapHandler:一条记录封装到一个Map集合中
* @throws SQLException
* */
@Test
public void demo5() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
Map<String,Object> map = queryRunner.query("select * from account where id =?", new MapHandler(), 4);
System.out.println(map);
}MapListHandler /**
* MapListHandler:一条记录封装到一个Map集合中
* @throws SQLException
* */
@Test
public void demo6() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
List<Map<String,Object>> list = queryRunner.query("select * from account", new MapListHandler());
for (Map<String, Object> map : list) {
System.out.println(map);
}
}DBUtils的ResultSetHandler实现类4—ColumnListHandler、ScalarHandler、 KeyedHandler ColumnListHandler:将数据中心的某列封装到list集合中/**
* ColumnListHandler:将某列的值封装到List集合中
* @throws SQLException
* */
@Test
public void demo7() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
List<Object> list = queryRunner.query("select name,money from account", new ColumnListHandler("name"));
for (Object object : list) {
System.out.println(object);
}
}ScalarHandler:将数据中心的某列封装到list集合中/**
* ScalarHandler:将单个的值封装
* @throws SQLException
* */
@Test
public void demo8() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
Object object = queryRunner.query("select count(*) from account", new ScalarHandler() );
System.out.println(object);
}KeyedHandler:将一条记录封装到一个Map集合中。将多条记录封装到一个装有Map集合的 Map集合中。而且外面的 Map的 key是可以指定的。
↑一条记录 ↑ | ↑ 多条记录 ↑ |
|---|
代码演示:
/**
* KeyedHandler:将一条记录封装到一个Map集合中。将多条记录封装到一个装有Map集合的 Map集合中
* @throws SQLException
* */
@Test
public void demo9() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());
Map<Object,Map<String,Object>> map = queryRunner.query("select * from account", new KeyedHandler("name") );//这里的"name"就是作为key的
for (Object key : map.keySet()) {
System.out.println(key+" "+map.get(key));
}
}