一、概述

Commons DbUtilsApache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能

jsbcTemplate的功能和作用相同

二、DbUtils使用步骤

 

1.导包

26 DbUtils学习

 

2.核心类: QueryRunner

 

构造方法:----->可以查看api使用,

 

QueryRunner() : 连接需要开发者自己管理连接对象,可以进行事务控制

QueryRunner(DataSource ds)  : 创建核心类对象的时候,需要一个连接池对象,工具会帮我们管理连接,但是不能

进行事务控制

 

 

 

成员方法:

         query()  : 就是用来做查询操作

                  query(String sql, ResultSetHandler<T> rsh, Object... params)

                    参数说明:

                       Sql : sql语句

                       ResultSetHandler : 结果集处理类

                       可变参数params

                  query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)

                 参数说明:

                       conn:链接对象

                       Sql : sql语句

                       ResultSetHandler : 结果集处理类

                       可变参数params

 

 

         update()  : 就是用来做增删改操作

              update(Connection conn, String sql, Object... params)

              update(String sql, Object... params)

 

3.ResultSetHandler接口的子实现类(只需要修改ResultSetHandler<T> rsh参数即可实现不同的返回)

 

   ArrayHandler : 将单个结果集数据封装为数组

    ArrayListHandler : 将查询到的多条数据封装为集合对象里面的每一条数据封装为数组

BeanHandler : 将查询到的单条数据封装为javabean对象

    BeanListHandler : 将查询到的多条数据封装为集合对象,里面的每一条数据封装为javabean对象

ColumnListHandler : 将查询到的单列数据封装为集合对象

MapHandler : 将查询到的单条数据封装为map集合对象

         Key : 存储的是列名

         Value : 存储的是列对应的值

MapListHandler : 将查询到的多条数据封装为list集合,里面的每一条数据封装为map集合

    ScalarHandler : 将查询到的单个结果进行封装

 

 

  

示例:

user表

CREATE TABLE `user` (

  `username` VARCHAR(20) NOT NULL,

  `password` VARCHAR(20) NOT NULL,

  `id` INT(20) NOT NULL AUTO_INCREMENT,

  PRIMARY KEY (`id`)

) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

 

user类

    private String username;

    private String password; 

    private int id;

 

 

dbutils操作

package com.itheima;

import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource;

import com.itheima.domain.User;

import com.itheima.utils.JDBCUtils;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.ResultSetHandler;

import org.apache.commons.dbutils.handlers.*;

import org.junit.Test;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;

public class DBUtilsDemo {

    @Test

    /**

     * 给数据库添加数据

     */

    public void insert() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "insert into user values (?,?,null)";

        //3,执行sql语句

        int update = runner.update(sql, "zhangsan","123456");

        System.out.println(update);//返回值是影响的行数

    }

    /**

     * 修改的功能

     */

    @Test

    public void update() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "update user set username = ? where id = ?";

        //3,执行sql语句

        int lisi = runner.update(sql, "lisi", 1);

        System.out.println(lisi);

    }

    /**

     * 删除数据的功能

     */

    @Test

    public void delete() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "delete from user where id = ?";

        //3,执行sql语句

        int update = runner.update(sql, 1);

        System.out.println(update);

    }

-----------------------------以上是update(增删改方法)----------------------------------------------->

-----------------------------下面是query(查询方法)-------------------------------------------------->

    /**

     * 查询单条数据

     *  自己实现ResultSetHandler接口

     */

    @Test

    public void findOne() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select * from user where id = ?";

        //3,执行sql语句

        User user = runner.query(sql, new ResultSetHandler<User>() {

            public User handle(ResultSet resultSet) throws SQLException {

                /**

                 * 参数

                 *      ResultSet: 查询结果封装的对象

                 * 返回值:

                 *      真正返回给使用者的对象

                 */

                //1,创建User对象

                User user = new User();

                //将resultSet结果集中的数据封装到user对象中

                //1,判断resultset结果集中是否有数据

                if(resultSet.next()) {

                    int id = resultSet.getInt("id");

                    String username = resultSet.getString("username");

                    String password = resultSet.getString("password");

                    //2,将获取到的字段值设置到user对象中

                    user.setId(id);

                    user.setUsername(username);

                    user.setPassword(password);

                }

                return user;

            }

        }, 2);

        System.out.println(user);

    }

-------------以上为自己实现ResultSetHandler接口,了解即可,开发中不会用,以下是重要--------------------->

    /**

     *

     * 查询单条数据BeanHandler

     */

    @Test

    public void findUserToBean() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select * from user where id = ?";

        //3,执行sql语句

        User user = runner.query(sql, new BeanHandler<User>(User.class), 2);

        System.out.println(user);

    }

    /**

     * 查询多条数据 BeanListHandler

     */

    @Test

    public void findUsers2List() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select * from user";

        //3,执行sql语句

        List<User> list = runner.query(sql, new BeanListHandler<User>(User.class));

        for (User user : list) {

            System.out.println(user);

        }

    }

    /**

     * MapHandler 查询单条数据

     */

    @Test

    public void findOneToMap() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select * from user where id = ?";

        //3,执行sql语句

        Map<String, Object> map = runner.query(sql, new MapHandler(), 2);

        //4,变量map集合

        Set<String> keys = map.keySet();

        for (String key : keys) {

            //根据key获取value

            Object value = map.get(key);

            System.out.println(key + "==" + value);

        }

    }

    /**

     * 查询多条数据 MapListHandler

     */

    @Test

    public void findUsersToMapList() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select * from user";

        //3,执行sql语句

        List<Map<String, Object>> list = runner.query(sql, new MapListHandler());

        //4,遍历

        for (Map<String, Object> map : list) {

            Set<Map.Entry<String, Object>> entries = map.entrySet();

            Iterator<Map.Entry<String, Object>> it = entries.iterator();

            while(it.hasNext()) {

                Map.Entry<String, Object> entry = it.next();

                String key = entry.getKey();

                Object value = entry.getValue();

                System.out.println(key + "==" + value);

            }

            System.out.println("--------------------------");

        }

    }

    /**

     * 查询单列数据 ColumnListHandler

     */

    @Test

    public void findColumn() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select username from user";

        //3,执行sql语句

        List<Object> list = runner.query(sql, new ColumnListHandler());

        System.out.println(list);

    }

    @Test

    public void findColumn1() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select * from user";

        //3,执行sql语句

        List<Object> list = runner.query(sql, new ColumnListHandler("password"));

        System.out.println(list);

    }

    /**

     * 查询单个结果 ScalarHandler,一般用于聚合函数查出来的结果

     */

    @Test

    public void find() throws SQLException {

        //1,创建核心类对象(执行sql语句的引擎)

        QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

        //2,编写sql语句

        String sql = "select count(*) from user";

        //3,执行sql语句

        Object count = runner.query(sql, new ScalarHandler());

        System.out.println(count);

    }

-----------------上面所有都是通过工具来管理连接池(JDBCUtils.getDataSource())------------------------>

   // 通过连接来对象来操作,QueryRunner runner = new QueryRunner();不需要传递参数,可以进行事务控制

    @Test

    public void find1() throws SQLException {

        //1,创建sql语句执行引擎

        QueryRunner runner = new QueryRunner();

        //2,编写sql语句

        String sql = "select * from user where id = ?";

        //3,执行sql语句

        //获取连接

        Connection conn = JDBCUtils.getConnection();

        User user = runner.query(conn, sql, new BeanHandler<User>(User.class), 3);

        System.out.println(user);

    }

}

 

 

 

相关文章: