QueryRunner类是DbUtils工具类里的核心类之一,提供了多种重载的query方法。
在API里对此类的介绍如下:Executes SQL queries with pluggable strategies for handling ResultSets(执行Sql语句,使用可插拔式策略操作结果集)。
QueryRunner(DataSource ds),其中的一个有参构造方法,不考虑事务问题时就可以用这个构造器直接获取数据库连接,
参数是一个数据库连接对象。
看一下QueryRunner类的源码,这是query的其中一个重载方法,ResultSetHandler接口就提现了可插拔策略,它有多个实现类,来对结果的获取形式进行一个操作。
下面分别介绍几个query重载方法,也就是获取不同的结果使用的几种ResultHandler实现类.
BeanHandler
BeanHandler(Class type),参数是一个Class实例,这里用到了对象关系映射
@Test
public void beanTest() throws SQLException {
QueryRunner qr=new QueryRunner(new ComboPooledDataSource("c3p0"));
String sql="select employee_id employeeId,first_name firstName,last_name lastName,email,"+
"phone_number phoneNumber,job_id jobId,salary,manager_id managerId, department_id departmentId from my_employees where employee_id=?";
Department de = qr.query(sql, new BeanHandler<>(MyEmployees.class),100);
//MyEmployees是一个JavaBean,里面封装的变量代表my_employees表的列名
System.out.println(de);
}
结果图:
上面的sql语句如果不给每一个列名起一个与javaBean里的成员变量名相同的别名的话结果就会如下图所示,如果列名和变量名相同就不用起别名:
ArrayListHandler
将每行结果转换为一个Object数组,然后将多个Object数组放入到list集合里
@Test
public void oneData() throws SQLException {
QueryRunner qr=new QueryRunner(new ComboPooledDataSource("c3p0"));
String sql="select employee_id employeeId,first_name firstName from my_employees where employee_id=?";
List<Object[]> query = qr.query(sql, new ArrayListHandler(), 100);
/* for (Object[] objects : query) {//相当于二维数组,从list集合取出每个Object[]一维数组
for (Object object : objects) {//遍历一维数组
System.out.println(object);
}
}*/
Object[] obj=query.get(0);
for (Object o : obj) {
System.out.print(o);
System.out.print(" ");
}
}
MapHandler & MapListHandler
区别就是,前者只能获取一个map集合,也就是只能获取表里第一行满足条件的数据。后者能获取所有满足条件的数据。
@Test
public void mapHandlerTest() throws SQLException {
QueryRunner qr=new QueryRunner(new ComboPooledDataSource("c3p0"));
String sql="select employee_id,first_name,salary from my_employees where manager_id=103";
Map map=qr.query(sql,new MapHandler());//MapHandler将ResultSet结果集里的第一行转换成一个map集合
//Set<Map.Entry<K,V>> entrySet()
Set<Map.Entry<Object,Object>> set = map.entrySet();
for (Map.Entry<Object, Object> entry : set) {
System.out.println(entry.getKey()+" : "+entry.getValue());
}
}
@Test
public void mapList() throws SQLException {
int i=0;
QueryRunner qr = new QueryRunner(new ComboPooledDataSource("c3p0"));
String sql="select employee_id ,first_name, manager_id from my_employees where manager_id=103";
//MapListHandler将结果集形成一系列的map集合放入list集合里
List<Map<String,Object>> list=qr.query(sql,new MapListHandler());
for (Map<String, Object> map : list) {
System.out.println("第"+(i++)+"个结果");
Set<Map.Entry<String,Object>> set = map.entrySet();
for (Map.Entry<String, Object> entry : set) {
System.out.println(entry.getKey()+" : "+entry.getValue());
}
System.out.println();
}
}
}