DBUtils学习笔记

DBUtils是面向持久层的

一、DBUtils介绍

  • 什么是dbutils,它的作用
    DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
    DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
  1. 对于数据表的读操作,它可以把结果转换成List,Array,Set等java集合,便于程序员操作;
  2. 对于数据表的写操作,也变得很简单(只需写sql语句)
  3. 可以使用数据源,使用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对象

  1. 构造函数
  • new QueryRunner(); 它的事务可以手动控制。
    也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象。
  • new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。
    此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
  1. 方法
  • 基本的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下的所有结果处理器
  1. ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
  2. ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
  3. ColumnListHandler:取某一列的数据。封装到List中。
  4. KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
  5. MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
    6.MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
  6. ScalarHandler:适合取单行单列数据
  7. BeanHandler
  8. 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接口);
全部评论

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
10-29 15:38
门头沟学院 Java
榕城小榕树:难道你简历里写了配送路径优化算法?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务