DBUtils学习笔记
DBUtils是面向持久层的
一、DBUtils介绍
- 什么是dbutils,它的作用
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
- 对于数据表的读操作,它可以把结果转换成List,Array,Set等java集合,便于程序员操作;
- 对于数据表的写操作,也变得很简单(只需写sql语句)
- 可以使用数据源,使用JNDI,数据库连接池等技术来优化性能–重用已经构建好的数据库连接对象
二、DBUtils的三个核心对象
- QueryRunner类
提供对sql语句操作的API
它主要有三个方法
query() 用于执行select
update() 用于执行insert update delete
batch() 批处理 - ResultSetHandler接口
用于定义select操作后,怎样封装结果集. - DBUtils类
它就是一个工具类,定义了关闭资源与事务处理的方法
三、Dbutils入门
//常用的包
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
- 导入jar包
- 创建QueryRunner对象
- 使用query方法执行select语句
- 使用ResultSetHandler封装结果集
- 使用DUUtils类释放资源
public User findUserById(String id) throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
return qr.query("select * from user where id=?", new BeanHandler<User>(
User.class), id);
}
四、QueryRunner对象
- 构造函数
- new QueryRunner(); 它的事务可以手动控制。
也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象。 - new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。
此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
- 方法
- 基本的CRUD操作
package com.util;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import com.entity.User;
public class TestCRUD {
@Test
public void testInsert() throws Exception {
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//执行query方法
qr.update("insert into users(username,password,email,birthday) values(?,?,?,?)", "菜10","123","c10@163.com","1990-2-1");
}
@Test
public void testSelect() throws Exception{
//创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//执行查询语句,返回结果集,根据id和name返回指定人
List<User> list = qr.query("SELECT * FROM users where id=? and username=?", new BeanListHandler<User>(User.class),1,"curry");
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testUpdate() throws Exception {
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//执行query方法
qr.update("update users set username=?,password=?,email=? where id=?","green","123","green@163.com","3");
}
@Test
public void testDelete() throws Exception {
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//执行query方法
qr.update("delete from users where id=?",3);
}
@Test//批量处理,只能执行相同的sql语句
public void testBatch() throws Exception {
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Object[][] params = new Object[3][];//3代表执行多少次
for (int i = 0; i < params.length; i++) {
params[i] = new Object[] {"菜10"+i,"123","c10@163.com","1990-2-1"};//给sql语句中?赋值
}
//执行query方法
qr.batch("insert into users(username,password,email,birthday) values(?,?,?,?)", params);
}
}
五、ResultSetHandler接口
- ResultSetHandler下的所有结果处理器
- ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
- ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
- ColumnListHandler:取某一列的数据。封装到List中。
- KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
- MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
6.MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中 - ScalarHandler:适合取单行单列数据
- BeanHandler
- BeanListHandler
package com.util;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.entity.User;
public class TestResultSetHandler {
@Test
public void ArrayHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Object[] arr = qr.query("select * from users where id=?", new ArrayHandler(),1);
for (Object obj : arr) {
System.out.println(obj);
}
}
@Test
public void ArrayListHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Object[]> list = qr.query("select * from users", new ArrayListHandler());
for (Object[] os : list) {
for (Object obj : os) {
System.out.println(obj);
}
System.out.println("-------------");
}
}
@Test
public void ColumnListHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Object> list = qr.query("select username,password,email from users", new ColumnListHandler(2));
for (Object obj : list) {
System.out.println(obj);
}
}
@Test
public void KeyedHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Map<Object, Map<String, Object>> map = qr.query("select * from users", new KeyedHandler(1));
for (Map.Entry<Object, Map<String, Object>> m : map.entrySet()) {
//外层map中key是id
System.out.println(m.getKey());
for (Map.Entry<String, Object> user : m.getValue().entrySet()) {
//内层map中key是列名,value是值
System.out.println(user.getKey()+"\t"+user.getValue());
}
System.out.println("-------------");
}
}
@Test
public void MapHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Map<String, Object> map = qr.query("select * from users where id=?", new MapHandler(),2);
for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.println(m.getKey()+"\t"+m.getValue());
}
}
@Test
public void MapListHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Map<String, Object>> list = qr.query("select * from users", new MapListHandler());
for (Map<String, Object> map : list) {//遍历list集合
for (Map.Entry<String, Object> m : map.entrySet()) {//遍历map集合
System.out.println(m.getKey()+"\t"+m.getValue());
}
System.out.println("--------------");
}
}
@Test
public void ScalarHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Object o = qr.query("select count(*) from users", new ScalarHandler(1));
System.out.println(o);
}
@Test
public void BeanHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
User user = qr.query("select * from users", new BeanHandler<User>(User.class));
System.out.println(user);
}
@Test
public void BeanListHandlertest() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<User> user = qr.query("select * from users where id=?", new BeanListHandler<User>(User.class),1);
System.out.println(user);
}
}
六、DBUtils控制事务的开发
package com.product.util;
import java.sql.Connection;
import java.sql.SQLException;
public class ManagerThreadLocal {
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//得到一个连接
public static Connection getConnection(){
Connection conn = tl.get();//从当前线程中取出一个连接
if(conn==null){
conn = C3P0Util.getConnection();//从池中取出一个
tl.set(conn);//把conn对象放入到当前线程对象中
}
return conn;
}
//开始事务
public static void startTransacation(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);//从当前线程对象中取出的连接,并开始事务
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit(){
try {
getConnection().commit();//提交事务
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void rollback(){
try {
getConnection().rollback();//回滚事务
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(){
try {
getConnection().close();//把连接放回池中
tl.remove();//把当前线程对象中的conn移除
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在Dao的QueryRunner对象里直接调用ManagerThreadLocal中的连接池
QueryRunner qr = new QueryRunner();
qr.update(ManagerThreadLocal.getConnection(),sql语句,ResultSetHandler接口);