欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();
        }
    }
}
相关标签: QueryRunner java