MySql的初学习 -- 第十五章 -- DBUtils


博客说明

文章内容输出来源:拉勾教育Java就业急训营

什么是DBUtils

使用JDBC我们发现冗余的代码太多了,为了简化开发 我们选择使用 DbUtils

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

Dbutils核心功能

  1. QueryRunner 中提供对sql语句操作的API.
  2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
  3. DbUtils类,他就是一个工具类,定义了关闭资源与事务处理相关方法.

准备工作

  1. 将这个 jar包添加到 myJar文件夹中
    在这里插入图片描述

JavaBean组件

JavaBean 就是一个类, 开发中通常用于封装数据,有一下特点

  1. 需要实现 序列化接口, Serializable
  2. 提供私有字段: private 类型 变量名;
  3. 提供 getter 和 setter
  4. 提供 空参构造

创建类和数据库的表对应

  1. 我们可以创建一个 entity包,专门用来存放 JavaBean类

在这里插入图片描述

创建一个JavaBean

package com.entity;

import java.io.Serializable;
import java.util.Date;

public class Employee implements Serializable {
    
    
    //对应数据库字段,类型和名称要一致
    private int id;
    private String name;
    private String gender;
    private double salary;
    private Date join_date;
    private int dept_id;

    //提供空参构造
    public Employee() {
    
    
    }

    //提供有参构造
    public Employee(int id, String name, String gender, double salary, Date join_date, int dept_id) {
    
    
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.salary = salary;
        this.join_date = join_date;
        this.dept_id = dept_id;
    }

    //get、set方法
    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getGender() {
    
    
        return gender;
    }

    public void setGender(String gender) {
    
    
        this.gender = gender;
    }

    public double getSalary() {
    
    
        return salary;
    }

    public void setSalary(double salary) {
    
    
        this.salary = salary;
    }

    public Date getJoin_date() {
    
    
        return join_date;
    }

    public void setJoin_date(Date join_date) {
    
    
        this.join_date = join_date;
    }

    public int getDept_id() {
    
    
        return dept_id;
    }

    public void setDept_id(int dept_id) {
    
    
        this.dept_id = dept_id;
    }

    //toString方法方便打印
    @Override
    public String toString() {
    
    
        return "Employee{" +
                "编号=" + id +
                ", 姓名='" + name + '\'' +
                ", 性别=" + gender +
                ", 工资=" + salary +
                ", 入职时间=" + join_date +
                ", 部门编号=" + dept_id +
                '}';
    }
}

DBUtils完成 CRUD(增删改查)

QueryRunner的创建

第一步,需要在之前建的DruidUtils中增加一个获取连接池的方法,QueryRunner的自动模式会用到

	/**
     * 获取连接池的方法
     * @return
     */
    public static DataSource getDataSource(){
    
    
        return dataSource;
    }

QueryRunner核心类库的创建方式

public class DBUtilsDemo {
    
    
    //QueryRunner 核心类的创建方式
    public static void main(String[] args) {
    
    
        //方式1:手动模式
        QueryRunner queryRunner = new QueryRunner();

        //方式2:自动模式   提供数据库连接对象,DBUtils会自动的维护连接
        QueryRunner queryRunner1 = new QueryRunner(DruidUtils.getDataSource());
    }
}

QueryRunner实现增删改

增加数据,手动模式

	/**
     * 增加数据,手动模式
     * @throws SQLException
     */
    @Test
    public void testInsert() throws SQLException {
    
    
        //1.创建QueryRunner  手动模式创建
        QueryRunner qr = new QueryRunner();

        //2.编写 占位符方式SQL
        String sql = "insert into table values (?,?,?)";

        //3.设置占位符的参数
        Object[] param = {
    
    null,"张飞","男"};

        //4.执行update方法
        Connection con = DruidUtils.gerConnection();
        int i = qr.update(con, sql, param);
        System.out.println(i);

        //5.释放资源
        //con.close();
        //安静的关闭
        DbUtils.closeQuietly(con);
    }

修改数据,自动模式

	/**
     * 修改数据,自动模式
     * @throws SQLException
     */
    @Test
    public void testUpdate() throws SQLException {
    
    
        //1.创建QueryRunner  自动模式创建
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        //2.编写 占位符方式SQL
        String sql = "Update employee set name= ? where id = ?";

        //3.设置占位符参数
        Object[] param = {
    
    "关羽",1};

        //4.执行修改操作  自动模式不需要传入Connection对象
        qr.update(sql,param);
		
		//5.自动模式下不需要释放资源,因为QueryRunner的自动模式已经包含,会自动
    }

删除数据,自动模式

/**
     * 删除数据
     * @throws SQLException
     */
    @Test
    public void testDelete() throws SQLException {
    
    
        //1.创建QueryRunner  自动模式创建
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        //2.编写 占位符方式SQL
        String sql = "delete from employee where id = ?";

        Object param = 1;

        qr.update(sql,param);
        
        //5.自动模式下不需要释放资源,因为QueryRunner的自动模式已经包含,会自动
    }

QueryRunner实现查询

QueryRunner实现查询需要用到ResultSetHandler接口

  1. ResultSetHandler可以对查询出来的ResultSet结果集进行处理,达到一些业务上的需求。
  2. 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 表操作。
方法 说明
query(String sql, handler ,Object[] param) 自动模式创建QueryRunner, 执行查询
query(Connection con,String sql,handler,Object[] param) 手动模式创建QueryRunner, 执行查询

下面会对加粗的方法都进行例子演示

ArrayHandler:查询一条数据,封装到数组中

	/**
     * 查询id为1的数据,封装到数组中
     */
    @Test
    public void testSelect01() throws SQLException {
    
    
        //1.创建QueryRunner  自动模式创建
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        //2.编写Sql
        String sql = "select * from employee where id=?";
        Object param = 1;

        //3.执行查询,获得结果集
        //ArrayHandler:结果集中的第一条记录封装到一个Object[]数组
        Object[] query = qr.query(sql, new ArrayHandler(), param);

        //4.获取数据
        System.out.println(Arrays.toString(query));
    }

ArrayListHandler:查询全部数据,封装到list集合中

 	/**
     * 查询全部数据,封装到list集合中
     */
    @Test
    public void testSelect02() 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));
        }
    }

BeanHandler:查询一条数据,封装到JavaBean中,再将JavaBean放到list集合中

 	/**
     * 查询id为1的数据,封装到JavaBean中,再将JavaBean放到list集合中
     */
    @Test
    public void testSelect03() throws SQLException {
    
    
        //1.创建QueryRunner  自动模式创建
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        //2.编写Sql
        String sql = "select * from employee where id=?";
        Object param = 1;

        //3.执行查询,获得结果集
        //BeanHandler(<Class<T> type>)
        //创建BeanHandler需要传递一个参数,参数就是JavaBean类的class文件对象
        //我自己建的JavaBean:Employee
        //Employee.class 通过反射区创建 Employee对象,将结果集封装到对象中,并返回
        Employee employee = qr.query(sql, new BeanHandler<Employee>(Employee.class), param);//ArrayHandler:结果集中的第一条记录封装到一个Object[]数组

        //4.获取数据
        System.out.println(employee);
    }

BeanListHandler:查询全部数据,封装到JavaBean中,再将JavaBean放到list集合中

/**
     * 查询全部数据,封装到JavaBean中,再将JavaBean放到list集合中
     */
    @Test
    public void testSelect04() throws SQLException {
    
    
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        String sql = "select * from employee";
        List<Employee> query = qr.query(sql, new BeanListHandler<Employee>(Employee.class));

        for (Employee employee : query) {
    
    
            System.out.println(employee);
        }
    }

MapHandler:查询数据,封装到Map中

/**
     * 查询id为1的数据,封装到Map中
     * MapHandLer 将结果的第一条数据封装到Map<String,Object>中  key对应的是列名,value对应的是值
     */
    @Test
    public void testSelect05() throws SQLException {
    
    

        //1.创建QueryRunner  自动模式创建
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());

        //2.编写Sql
        String sql = "select * from employee where id = ?";

        //3.执行查询,获得结果集
        Map<String, Object> map = qr.query(sql, new MapHandler(), 1);
        //4.获取map
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        //5.获取数据
        for (Map.Entry<String, Object> entry : entries) {
    
    
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
    }

ScalarHandler :查询一个数据

/**
     * 查询所有员工工资总额
     * ScalarHandler  用于封装单个的数据
     */
    @Test
    public void testSelect06() throws SQLException {
    
    
        //1.创建QueryRunner  自动模式创建
        QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
        //2.编写Sql
        String sql = "select sum(salary) from employee";

        //3.这里转成double是因为工资的类型是double,以后需要什么类型转什么类型即可
        Double sum = (double)qr.query(sql, new ScalarHandler<>());

        //4.获取数据
        System.out.println(sum);
    }

猜你喜欢

转载自blog.csdn.net/zy3062231314/article/details/113105317