专栏首页wangweijunDBUtils框架的使用(下)

DBUtils框架的使用(下)

刚才讲了使用QueryRunner插入、修改、更新数据,现在来学习一下使用QueryRunner进行数据库表查询。 通过QueryRunner类的query()方法即可完成数据库表的查询操作,但是在查询的时候需要实现ResultSetHandler接口来将结果集封装成对象。可以通过自己实现接口,但很显然,我们应该使用DBUtils工具包提供的实现类来实现封装。 在DBUtils框架中,共提供了九个ResultSetHandler的实现类。

  • ArrayHandler:把结果集中的第一行数据转成对象数组。
  • ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
  • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
  • BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
  • ColumnListHandler:将结果集中某一列的数据存放到List中。
  • MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
  • MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
  • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的key。
  • ScalarHandler:将结果集中的列的信息转换到一个对象中

分别通过案例感受一下。 新建测试类ResultSetHandlerTest 然后添加成员变量

private ComboPooledDataSource dataSource = new ComboPooledDataSource();

添加ArrayHandler的测试代码

	@Test
	public void testArrayHandler() throws SQLException{
		//ArrayHandler	将结果集的第一行数据存入Object数组
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";

		//数组的每一个元素对应第一行数据的每一列
		Object[] objects = queryRunner.query(sql, new ArrayHandler());
		System.out.println(Arrays.toString(objects));
	}

运行代码

添加ArrayListHandler测试代码

	@Test
	public void testArrayListHandler() throws SQLException{
		//ArrayListHandler	将结果集的每一行数据存入Object数组,然后存入List
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";
		List<Object[]> list = queryRunner.query(sql, new ArrayListHandler());
		
		for(Object[] objects : list){
			System.out.println(Arrays.toString(objects));
		}
	}

运行代码

添加BeanHandler测试代码

	@Test
	public void testBeanHandler() throws SQLException{
		//BeanHandler	将结果集的第一行数据封装到JavaBean对象中
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";
		
		//传入Account.class参数是为了在方法中通过反射构造Account对象实例
		Account account = queryRunner.query(sql, new BeanHandler<Account>(Account.class));
		System.out.println(account.getId());
		System.out.println(account.getName());
		System.out.println(account.getMoney());
	}

运行代码

注意事项:使用BeanHandler,表列名必须与Bean类的属性名称一致。

添加BeanListHandler测试代码

	@Test
	public void testBeanListHandler() throws SQLException{
		//BeanListHandler	将结果集每一条数据都封装到JavaBean对象,再存入List
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";
		List<Account> list = queryRunner.query(sql, new BeanListHandler<Account>(Account.class));
		
		for(Account account : list){
			System.out.print(account.getId() + "\t");
			System.out.print(account.getName() + "\t");
			System.out.print(account.getMoney());
			System.out.println();
		}
	}

运行代码

添加ColumnListHandler测试代码

	@Test
	public void testColumnListHandler() throws SQLException{
		//ColumnListHandler		获得结果集的某一列
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";
		
		//泛型为什么写Object	因为每列的类型都不一样
		List<Object> list = queryRunner.query(sql, new ColumnListHandler("name"));
		System.out.println(list);
	}

运行代码

添加MapHandler测试代码

	@Test
	public void testMapHandler() throws SQLException{
		//MapHandler	将结果集中的第一行数据封装到Map集合,key是列名,value是数据值
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";
		Map<String, Object> map = queryRunner.query(sql, new MapHandler());
		System.out.println(map);
	}

运行代码

添加MapListHandler测试代码

	@Test
	public void testMapListHandler() throws SQLException {
		// MapHandler 将结果集中的每一行数据封装到Map集合,key是列名,value是数据值,再将Map对象存入List
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";
		List<Map<String,Object>> list = queryRunner.query(sql, new MapListHandler());
		
		for(Map<String,Object> map : list){
			System.out.println(map);
		}
	}

运行代码

添加KeyedHandler测试代码

	@Test
	public void testKeyedHandler() throws SQLException {
		// KeyedHandler	将结果集中的每一行数据都封装到Map里,再将Map存入一个Map里,key可以指定为任意列
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from account";
		Map<Object, Map<String,Object>> map = queryRunner.query(sql, new KeyedHandler("name"));
		
		System.out.println(map);
	}

运行代码

添加ScalarHandler测试代码

	@Test
	public void testScalarHandler() throws SQLException{
		//ScalarHandler		通常保存只有一行一列的结果数据
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select count(*) from account";
		long count = (Long) queryRunner.query(sql, new ScalarHandler(1));
		System.out.println(count);
	} 

运行代码

到这里,九个Hanlder就介绍完毕了。 最常用的几个: BeanHandler、BeanListHandler、ColumnListHandler、ScalarHandler。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DBUtils框架的使用(上)

    昨天做了这么多的铺垫,当然就是为了引出今天的DBUtils框架了,它的实现原理跟我们编写的简易框架是类似的。 话不多说,进入正题。 commons-dbut...

    wangweijun
  • 隔离级别引发问题实验

    继续上篇博客 事务特性及隔离问题。 我们来做一个关于隔离级别的实验,将演示各个级别导致的隔离问题。 我们先打开两个MySQL窗口,来模拟并发操作。

    wangweijun
  • Java多线程详解

    今天我们聊一聊多线程,谈到多线程,很多人就开始难受,这是一个一听就头疼的话题,但是,我希望你在看完这篇文章后能对多线程有一个深入的了解。

    wangweijun
  • 开发 | 小程序音频接口全攻略!一篇文章教你玩转它们

    知晓程序(微信号 zxcx0101)分享的这篇文章,就来告诉你如何正确地让小程序播放音频。

    知晓君
  • 独家 | 经验&教训分享:我的第一个机器学习项目

    在这片博客中,我将介绍队友(Aron,Ashish,Gabriel)和我如何完成我们的第一个机器学习项目。写这篇博客的目的是为了记录——记录下我作为一名有抱负的...

    数据派THU
  • 4.11 VR扫描:Acer公布新款WMR头显;Dent Reality推室内AR导航解决方案

    近日,Acer公布新款WMR头显:ConceptD OJO。该头显与惠普的Reverb相同,有两块2160×2160分辨率的LCD显示面板,并允许用户根据个人瞳...

    VRPinea
  • 6.3 VR扫描:工信部近期将发放5G商用牌照;添田武人卸任索尼互娱中国区总裁

    今日,工信部正式确认,中国将于近期发放5G商用牌照。此前,工信部曾多次表示,在5G产业链成熟的情况下,工信部将会适时发放5G牌照。此次消息的确认,意味着我国包括...

    VRPinea
  • WanShare‘天天分红’计划喊你来躺赚

    WanShare‘天天分红’计划(详情请登录wanshare平台官网或者关注官方微信:wanshare88查看)

    链小二
  • 谷歌重磅推出TensorFlow Graphics:为3D图像任务打造的深度学习利器

    近年来,可插入到神经网络架构中的一种新型可微图形层(differentiable graphics layers)开始兴起。

    新智元
  • 11.21 VR扫描:广告公司Admix收购VRFocus;兵马俑VR体验中心将于2019年底试运营

    SUPER.COM是为游戏公司和项目进行种子和风险投资的专业基金组织。现已面向所有虚幻引擎开发者开放,资产规模达5000万美元。其将为每位开发者提供高达100多...

    VRPinea

扫码关注云+社区

领取腾讯云代金券