dbUtils 该用哪个 Handler 笔记

【 BeanHandler就是把一条结果集映射到javaBean中,】
【 BeanListHandler就是把多个JavaBean映射到List中,】
【 MapHandler,把单行结果集封装到Map对象中 】
【 MapListHandler,把多行结果集封装到List中,即多个Map放在List中 】
【 ScalarHandler,把单行单列的结果集封装到Object中,如sql语句中有 count(*) 】
【 如果一行结果集中包含了两张表的列,使用MapHandler来处理 】

【1】 BeanHandler 将 [ 单行结果集 ] 映射到javaBean中。
即数据库查询的结果只有一条记录
String sql = "select * from t_person where pid=?";
此时使用 BeanHandler()

		QueryRunner qr = new TxQueryRunner();
		/*
		 * 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型。
		 * 
		 * BeanHandler --> 它是ResultSetHandler的实现类,它的作用是把结果集封装到Person对象中
		 */
		Person p = qr.query(sql, new BeanHandler<Person>(Person.class), "1");
		System.out.println(p);

【2】BeanListHandler 将 【多行结果集】映射到List中。
即数据库查询的结果有多条记录
String sql = "select * from t_person";

	/**
	 * 使用BeanListHandler
	 *   把多行结果集映射到List<Bean>,即多个JavaBean对象。
	 *   一行结果集记录对应一个javaBean对象,多行就对应List<Bean>
	 */
		QueryRunner qr = new TxQueryRunner();
		/*
		 * 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型。
		 * BeanListHandler --> 它是ResultSetHandler的实现类,
		 *   它的作用是把结果集封装到List<Person>对象中
		 */
		List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
		System.out.println(list);

【3】MapHandler,把 [ 单行结果集 ] 封装到Map对象中。
列名做key, 列值做value

		String sql = "select * from t_person where pid=?";
		QueryRunner qr = new TxQueryRunner();
		/*
		 */
		Map<String, Object> map = qr.query(sql, new MapHandler(), "1");
		System.out.println(map);

【4】使用MapListHandler,把多行结果集封装到List中,即多个Map放在List中
一行对应一个Map,多行对应List

		String sql = "select * from t_person";
		QueryRunner qr = new TxQueryRunner();
		/*
		 * 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型。
		 * 
		 * BeanListHandler --> 它是ResultSetHandler的实现类,
		 *   它的作用是把结果集封装到List<Person>对象中
		 */
		List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
		System.out.println(mapList);

【5】使用ScalarHandler,把单行单列的结果集封装到Object中。
SQL语句中带有 count(*) 就用它 ,结果强转成Number类型。

	public void testQuery5() throws SQLException {
		String sql = "select count(*) from t_person";//结果集是单行单列的
		QueryRunner qr = new TxQueryRunner();

		Object obj = qr.query(sql, new ScalarHandler());
		/*
		 * 我们知道select count(1),结果一定是个整数!
		 * > Integer
		 * > Long
		 * > BigInteger
		 * 
		 * 不同的驱动,结果不同!
		 * 无论是哪种类型,它都是Number类型!强转成Number一定不出错
		 */
		Number number = (Number)obj;
		long cnt = number.longValue();
		System.out.println(cnt);

【6】一行结果集中包含了两张表的列用MapHandler
如 Persion类和Address类,Persion中有Address address;
Persion类中的addressId是外键,即是Address 类的主键

	/**
	 * 一行结果集中包含了两张表的列
	 * 使用MapHandler来处理
	 * 1. 把结果集封装到map中
	 * 2. 使用map生成Person对象
	 * 3. 使用map生成address对象
	 * 4. 把两个实体对象建立关系
	 * @throws SQLException
	 */
	@Test
	public void testQuery6() throws SQLException {
		String sql = "SELECT * FROM t_person p, t_address a WHERE p.aid=a.aid AND p.pid=?";
		QueryRunner qr = new TxQueryRunner();
		/*
		 * 1. 得到Map
		 */
		Map map = qr.query(sql, new MapHandler(), "aaa");
		/*
		 * 2. 把Map中部分数据封装到Person中
		 */
		Person p = CommonUtils.toBean(map, Person.class);
		/*
		 * 3. 把Map中部分数据封装到Address中
		 */
		Address addr = CommonUtils.toBean(map, Address.class);
		/*
		 * 4. 建立两个实体的关系
		 */
		p.setAddress(addr);
		
		System.out.println(p);
	}
需要导入的包名
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
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 cn.itcast.commons.CommonUtils;
import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.TxQueryRunner;

猜你喜欢

转载自blog.csdn.net/duanbaoke/article/details/85944441