zoukankan      html  css  js  c++  java
  • JDBC:DBUtils完成 CRUD

    1 ResultSetHandler接口简介

      ResultSetHandler可以对查询出来的ResultSet结果集进行处理,达到一些业务上的需求。 

    2 ResultSetHandler 结果集处理类

      本例展示的是:使用ResultSetHandler接口的几个常见实现类,实现数据库的增删改查 (可以大大减少代码量,优化程序)

      每一种实现类,都代表了对查询结果集的一种处理方式

    ResultSetHandler

    实现类

    说明

    ArrayHandler


    将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这 条记录中的每一个字段的值

    ArrayListHandler

    将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集 合中

    BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中
    BeanListHandler

    将结果集中每一条记录封装到指定的javaBean中,再将这些javaBean在封装到List 集合中

    ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
    KeyedHandler

    将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个 Map的value,另一个Map集合的key是指定的字段的值

    MapHandler 将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称, value就是字段值
    MapListHandler 将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称, value就是字段值,在将这些Map封装到List集合中
    ScalarHandler 它是用于封装单个数据。例如 select count(*) from 表操作

    3 ResultSetHandler 常用实现类测试 

      QueryRunner的查询方法   

      query方法的返回值都是泛型,具体的返回值类型,会根据结果集的处理方式,发生变化

    方法

    说明

    query(String sql, handler ,Object[] param) 

    自动模式创建QueryRunner, 执行查询<b

    query(Connection con,String sql,handler,Object[] param)

    手动模式创建QueryRunner, 执行查询

      创建一个测试类, 对ResultSetHandler接口的几个常见实现类进行测试 

        <1>查询id为5的记录,封装到数组中 

        <2>查询所有数据,封装到List集合中 

        <3>查询id为5的记录,封装到指定JavaBean中

        <4>查询薪资大于 3000 的所员工信息,封装到JavaBean中,再封装到List集合中 

        <5>查询姓名是 张百万的员工信息,将结果封装到Map集合中 

        <6>查询所有员工的薪资总额 

    <1> 查询id为5的记录,封装到数组中

       /*
        *   查询id为5的记录,封装到数组中
        *   ArrayHandler 将结果集的第一条数据封装到数组中
        * */
    
        @Test
        public void testFindById() throws SQLException {
     
            //1.创建QueryRunner
            QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
     
            //2.编写SQL
            String sql = "select * from employee where eid = ?";
     
            //3.执行查询
            Object[] query = qr.query(sql, new ArrayHandler(), 5);
     
            //4.获取数据
            System.out.println(Arrays.toString(query));
        }

    <2> 查询所有数据,封装到List集合中

       /**
         * 查询所有数据,封装到List集合中
         * ArrayListHandler可以将每条数据先封装到数组中, 再将数组封装到集合中
         *
         */
        @Test
        public void testFindAll() throws SQLException {
     
            //1.创建QueryRunner
            QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
     
            //2.编写SQL
            String sql = "select * from employee";
     
            //3.执行查询
            List<Object[]> query = qr.query(sql, new ArrayListHandler());
     
            //4.遍历集合获取数据
            for (Object[] objects : query) {
                System.out.println(Arrays.toString(objects));
            }
        }
     

    <3> 根据ID查询,封装到指定JavaBean中

      /**
         * 查询id为3的记录,封装到指定JavaBean中
         * BeanHandler 将结果集的第一条数据封装到 javaBean中
         *
         **/ 
    
        @Test
        public void testFindByIdJavaBean() throws SQLException {
     
            QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
     
            String sql = "select * from employee where eid = ?";
     
            Employee employee = qr.query(sql, new BeanHandler<Employee>(Employee.class), 3);
     
            System.out.println(employee);
        }
     

    <4> 查询薪资大于 3000 的所有员工信息,封装到JavaBean中再封装到List集合中

       /*
        * 查询薪资大于 3000 的所员工信息,封装到JavaBean中再封装到List集合中
        * BeanListHandler 将结果集的每一条数据, 封装到 JavaBean中,  再将JavaBean,  放到list集合中
        **/
    
        @Test
        public void testFindBySalary() throws SQLException {
     
            QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
     
            String sql = "select * from employee where salary > ?";
     
            List<Employee> list = qr.query(sql, new BeanListHandler<Employee>(Employee.class), 3000);
     
            for (Employee employee : list) {
    System.out.println(employee); } }

    <5> 查询姓名是 张百万的员工信息,将结果封装到Map集合中

       /*
        * 查询姓名是 张百万的员工信息,将结果封装到Map集合中
        * MapHandler 将结果集的第一条记录封装到 Map<String,Object>中    
        * key对应的是 列名 value对应的是 列的值
        * */
    
        @Test
        public void testFindByName() throws SQLException {
     
            QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
     
            String sql = "select * from employee where ename = ?";
     
            Map<String, Object> map = qr.query(sql, new MapHandler(), "张百万");
     
            Set<Map.Entry<String, Object>> entries = map.entrySet();
     
            for (Map.Entry<String, Object> entry : entries) {
                //打印结果
                System.out.println(entry.getKey() +" = " +entry.getValue());
            }
        }

     

    <6> 查询所有员工的薪资总额

        /*
        *  查询所有员工的薪资总额
        *  ScalarHandler 用于封装单个的数据
        * */
    
        @Test
        public void testGetSum() throws SQLException {
     
            QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
     
            String sql = "select sum(salary) from employee";
     
            Double sum = (Double)qr.query(sql, new ScalarHandler<>());
     
            System.out.println("员工薪资总额: " + sum);
        }
  • 相关阅读:
    ADB命令大全
    Backup your Android without root or custom recovery -- adb backup
    Content portal for Pocketables Tasker articles
    Is there a way to detect if call is in progress? Phone Event
    Tasker to proximity screen off
    Tasker to detect application running in background
    Tasker to create toggle widget for ES ftp service -- Send Intent
    Tasker to proximity screen on
    Tasker to answer incoming call by pressing power button
    Tasker to stop Poweramp control for the headset while there is an incoming SMS
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/15061537.html
Copyright © 2011-2022 走看看