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。
DBUtils框架的使用(下)的更多相关文章
- Apache—DBUtils框架简介
转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner ...
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表
本文目录: 1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData 2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData ...
- JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作
1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...
- javaweb学习总结(四十一)——Apache的DBUtils框架学习
一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
- Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用
前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...
- JDBC第四篇--【数据库连接池、DbUtils框架、分页】
1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的. 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接池 ...
- JDBC【数据库连接池、DbUtils框架、分页】
1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...
- pache—DBUtils框架简介、DbUtils类、QueryRunner类 、ResultSetHandler接口
Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC ...
- Apache的DBUtils框架学习(转)
原文地址:http://www.cnblogs.com/xdp-gacl/p/4007225.html 一.commons-dbutils简介 commons-dbutils 是 Apache 组织提 ...
随机推荐
- python列表、元组、字典练习题
1.元素分类 有如下值集合[11,22,33,44,55,66,77,88,99,90], 将所有大于66的值保存至字典的第一个key中,将小于66值保存至第二个key的值中. li = [11,22 ...
- Java网络和代理
Java网络和代理 1)简介 在当今的网络环境中,特别是企业网络环境中,应用程序开发人员必须像系统管理员一样频繁地处理代理.在某些情况下,应用程序应该使用系统默认设置,在其他情况下,我们希望能够非常严 ...
- Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two
传送门 D. Divide by three, multiply by two •题意 给你一个数 x,有以下两种操作,x 可以任选其中一种操作得到数 y 1.如果x可以被3整除,y=x/3 2.y= ...
- Spring Cloud 之 Gateway.
一.Gateway 和 Zuul 的区别 Zuul 基于servlet 2.5 (works with 3.x),使用阻塞API.它不支持任何长期的连接,如websocket. Gateway建立在S ...
- element 上传组件 el-upload 的经验总结
前言 最近在做后台管理项目,采用的 vue-element-admin ,上传图片是一个很常用的功能,也遇到了很多问题,刚好趁此机会做一些总结. 初步总结下会提到的问题,目录如下: el-upload ...
- <java程序大集合>
1.以下关于开发java程序的描述错误的是(). A.开发java程序的步骤包括:编写源程序,编译,运行 B.编写的java源程序文件使用.java作为扩展名 C:java源文件经编译后,生成后娺为. ...
- Web访问原理-从输入URL到页面加载完成的过程中都发生了什么事情?
从输入URL到页面加载完成的过程中都发生了什么事情?--这是一个经典的面试题: 主要是关于计算机网络方面的知识基础,对于非科班计算机自学web开发的同学可能理解起来就很困难. StackOverFlo ...
- web设计_4_可扩展的行
不要指定横向页面组件的高度,要让它们能够在纵向自由扩展. 常见的包含文章正文或大段文字的区域,应该适应任何篇幅和大小的文字. 但是例如文章标题.登陆信息栏等也要考虑文字内容数量及高度的变化. 例如:下 ...
- (读论文)推荐系统之ctr预估-NFM模型解析
本系列的第六篇,一起读论文~ 本人才疏学浅,不足之处欢迎大家指出和交流. 今天要分享的是另一个Deep模型NFM(串行结构).NFM也是用FM+DNN来对问题建模的,相比于之前提到的Wide& ...
- 10w数组去重,排序,找最多出现次数
配置在博客底部 主函数 package ooDay11.zy13; import ooDay11.zy13.hanshu.GetKeyList;import ooDay11.zy13.hanshu.G ...