DBUtils中queryrunner 9个ResultSetHandler
程序员文章站
2024-02-29 10:50:46
...
DBUtils中queryrunner 9个ResultSetHandler
ResultSetHandler | 作用 |
---|---|
ArrayHandler | 用来将查询结果的第一行数据, 封装到: Object[] 返回值的数据类型是: Object[] |
ArrayListHandler | 用来将查询结果的每一行数据, 封装成: Object[] 然后整体的放到一个List集合中. 返回值的数据类型是: List<Object[]> |
MapHandler | 用来将查询结果的第一行数据, 封装到: Map<String, Object> 列名做键, 该列的值作为值. 返回值的数据类型是: Map<String, Object> |
MapListHandler | 用来将查询结果的每一行数据, 封装成: Map<String, Object> 然后整体的放到一个List集合中. 返回值的数据类型是: List<Map<String, Object>> |
BeanHandler | 用来将查询结果的第一行数据, 封装到: 实体对象中. 前提: 实体类必须存在. 返回值的数据类型是: 实体类对象, 例如: Users类的对象. |
BeanListHandler | 用来将查询结果的每一行数据, 封装成: Bean对象 然后整体的放到一个List集合中. 返回值的数据类型是: List<实体类类型> |
ScalarHandler | 用来做单值查询的. 单值查询: 指的是一行一列的数据, 一般多用于 聚合操作. count(), sum(), max(), min(), avg() 返回值的数据类型是: Object |
ColumnListHandler | 用来将某一列(指定的类)的所有数据, 封装到List集合中. 返回值的数据类型是: List |
KeyedHandler | 用来将查询结果的每一行数据, 封装成: 指定的列 -> Map<String, Object> 然后整体的放到一个Map集合中. 返回值的数据类型是: Map<指定的列, Map<String, Object>> |
package com.itheima.demo04_DBUtils;
import com.itheima.domain.Users;
import com.itheima.utils.DruidUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import javax.crypto.MacSpi;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
//案例: 演示DBUtils操作 查询语句, 必须掌握 前8个方法.
//涉及到的方法: *** query(String sql, ResultSetHandler rsh, Object... params) 根据处理方式不同, 获取的结果集也不同.
//ResultSetHandler是一个接口, 表示对结果集的处理方式, 常用的子类主要有: 8个.
public class ClassDemo02 {
/**
* ArrayHandler: 用来将查询结果的第一行数据, 封装到: Object[]
*
* 返回值的数据类型是: Object[]
*/
@Test
public void show1() {
//需求: 操作web03库中的users表, 将第一个数据封装成: Object[]
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users where uid = ? ;";
try {
//3. 操作结果.
Object[] obj = qr.query(sql, new ArrayHandler(), 3);
System.out.println(Arrays.toString(obj));
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* ArrayListHandler: 用来将查询结果的每一行数据, 封装成: Object[]
* 然后整体的放到一个List集合中.
*
* 返回值的数据类型是: List<Object[]>
*/
@Test
public void show2() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users;";
try {
//3. 操作结果.
List<Object[]> list = qr.query(sql, new ArrayListHandler());
//遍历list
for (Object[] arr : list) {
System.out.println(Arrays.toString(arr));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* MapHandler: 用来将查询结果的第一行数据, 封装到: Map<String, Object>
* 列名做键, 该列的值作为值.
*
* 返回值的数据类型是: Map<String, Object>
*/
@Test
public void show3() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users;";
try {
//3. 操作结果.
Map<String, Object> map = qr.query(sql, new MapHandler());
System.out.println(map);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* MapListHandler: 用来将查询结果的每一行数据, 封装成: Map<String, Object>
* 然后整体的放到一个List集合中.
*
* 返回值的数据类型是: List<Map<String, Object>>
*/
@Test
public void show4() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users;";
try {
//3. 操作结果.
List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
//遍历list集合
for (Map<String, Object> map : list) {
System.out.println(map);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* BeanHandler: 用来将查询结果的第一行数据, 封装到: 实体对象中.
* 前提: 实体类必须存在.
*
* 返回值的数据类型是: 实体类对象, 例如: Users类的对象.
*/
@Test
public void show5() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users;";
try {
//3. 操作结果.
Users us = qr.query(sql, new BeanHandler<>(Users.class));
System.out.println(us);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* BeanListHandler: 用来将查询结果的每一行数据, 封装成: Bean对象
* 然后整体的放到一个List集合中.
*
* 返回值的数据类型是: List<实体类类型>
*/
@Test
public void show6() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users;";
try {
//3. 操作结果.
List<Users> list = qr.query(sql, new BeanListHandler<>(Users.class));
//遍历list集合
for (Users users : list) {
System.out.println(users);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* ScalarHandler: 用来做单值查询的.
* 单值查询: 指的是一行一列的数据, 一般多用于 聚合操作.
* count(), sum(), max(), min(), avg()
*
* 返回值的数据类型是: Object
*/
@Test
public void show7() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select count(*) from users;";
try {
//3. 操作结果.
Object obj = qr.query(sql, new ScalarHandler());
System.out.println(obj);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* ColumnListHandler: 用来将某一列(指定的类)的所有数据, 封装到List集合中.
*
* 返回值的数据类型是: List<Object>
*/
@Test
public void show8() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users;";
try {
//3. 操作结果.
//如果不传参, 默认封装第一列.
//List<Object> list = qr.query(sql, new ColumnListHandler());
//如果传参, 则封装指定的列(前提: 该列在查询结果中必须存在)
List<Object> list = qr.query(sql, new ColumnListHandler("password"));
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 这种方式, 了解即可, 用到的不是特别的多.
* KeyedHandler: 用来将查询结果的每一行数据, 封装成: 指定的列 -> Map<String, Object>
* 然后整体的放到一个Map集合中.
*
* 返回值的数据类型是: Map<指定的列, Map<String, Object>>
*/
@Test
public void show9() {
//1. 创建QueryRunner.
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行SQL语句, 获取结果集.
String sql = "select * from users;";
try {
//3. 操作结果.
//如果不传入列, 则默认用第一列.
//Map<Object, Map<String, Object>> maps = qr.query(sql, new KeyedHandler());
//采用指定的列, 作为最后获取到的双列集合的: 键.
Map<Object, Map<String, Object>> maps = qr.query(sql, new KeyedHandler("username"));
for (Object key : maps.keySet()) {
System.out.println(key + "..." + maps.get(key));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
上一篇: python中MethodType方法介绍与使用示例
下一篇: MyBatis 引入映射器的方法