Skip to content

Apache——DBUtils


引入外部库

获取 commons-dbutils-1.3

安装包: https://pan.baidu.com/s/1hNC1vSXbkvOGnHNJS0SqaQ?pwd=3tn6 提取码: 3tn6

使用方法:拷贝 jar 包到 libs 文件目录下,右键添加为库,可以参考前面获取 mysql-connector-java-5.1.37-bin.jar 的操作

问题引入

(1)关闭 connection 后,resultSet 结果集无法使用

(2)resultSet 不利于数据的管理

基本介绍

使用该工具类,可以将 resultSet 的内容映射到一个类中,每一个列属性就对应一个字段,然后把每一条记录封装成对象放到 ArrayList 集合中,即使关闭 connection,仍然可以获取结果集的内容

alt text

alt text

数据库表映射

基本介绍

将数据库的列信息映射为一个类,称这个类为:Javabean,POJO,Domian 对象

数据库类型映射表

alt text

相关方法

首先创建 QueryRunner 对象

DQL 语句:调用 query() 方法

DML 语句:调用 update() 方法

结合 DruidUtils 工具类

java
public class JDBCUtils_Druid {
    private static DataSource dataSource;

    // 静态代码块初始化
    static {
        // 读取配置文件信息
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream("src/druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    // 连接方法
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    // 关闭连接(注意:这里不是真的断掉连接,只是把使用的Connection对象放回连接池)
    public static void close(ResultSet resultSet, Connection connection, Statement statement){
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (connection != null) {
                connection.close();
            }
            if (statement != null) {
                statement.close();
            }
        } catch (SQLException e) {
            /*
                实际开发中常用下面的方式处理
                1. 将编译异常转为运行异常
                2. 调用者可以选择捕获该异常,也可以选择默认处理该异常,比较方便
             */
            throw new RuntimeException(e);
        }
    }
}

映射类:Actor

java
import java.util.Date;

public class Actor { //Javabean, POJO, Domain对象

    private Integer id;
    private String name;
    private String sex;
    private Date borndate;
    private String phone;

    public Actor() { //一定要给一个无参构造器[反射需要]
    }

    public Actor(Integer id, String name, String sex, Date borndate, String phone) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.borndate = borndate;
        this.phone = phone;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBorndate() {
        return borndate;
    }

    public void setBorndate(Date borndate) {
        this.borndate = borndate;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "\nActor{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", borndate=" + borndate +
                ", phone='" + phone + '\'' +
                '}';
    }
}

DQL 语句

基本介绍

首先创建 QueryRunner 对象

调用 query(connection,sql,new BeanListHandler<>(映射类.class),...) 方法,返回的是一个集合,遍历集合即可显示表的查询信息

⭐ 关闭资源:底层会得到 resultset,会在 query 关闭,其次还会得到 preparedStatment 对象并关闭,只需要关闭 connection 即可

参数说明

connection:可以利用 JDBCUtils_Druid 获取连接

sql:传入需要执行的 sql 语句

new BeanListHandler<>():将结果集中的每一行数据都封装到一个对应的 javabean 实例中,存放在 List 里(还可以 new 其他类,根据查询需求选择,具体如下图)

映射类.class:通过反射,拿到结果集中的信息,并把这个对象封装到 ArrayList 中

... :这是可变参数,当 sql 语句中有多个 ? 时,这个时候就可以填多个值,和 ? 一一对应

内容查询参数类

alt text

全表查询

new BeanListHandler<>()

java
public static void query() throws Exception{
    // 获取连接
    Connection connection = JDBCUtils_Druid.getConnection();
    // 获取 QueryRunner 对象,用它去调用相应的方法
    QueryRunner queryRunner = new QueryRunner();
    // 定义 sql 语句
    String sql = "select * from actor";
    // 调用查询方法
    List<Actor> list = queryRunner.query(connection,sql,new BeanListHandler<>(Actor.class));
    // 遍历,打印查询信息
    for (Actor actor:list){
        System.out.println(actor);
    }
    // 关闭资源
    JDBCUtils_Druid.close(null,connection,null);
}

单行查询

new BeanHandler<>(),返回的是当行记录,对应单个对象

java
public static void query() throws Exception{

    // 获取连接
    Connection connection = JDBCUtils_Druid.getConnection();
    // 获取 QueryRunner 对象,用它去调用相应的方法
    QueryRunner queryRunner = new QueryRunner();
    // 定义 sql 语句
    String sql = "select * from actor where id = ?";
    // 调用查询方法
    Actor query = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class),10);
    // 打印查询信息
    System.out.println(query);
    // 关闭资源
    JDBCUtils_Druid.close(null,connection,null);
}

单行单列查询

new ScalarHandler(),返回单个对象

ScalarHandler() 不需要传入类.class

java
public static void query() throws Exception{

    // 获取连接
    Connection connection = JDBCUtils_Druid.getConnection();
    // 获取 QueryRunner 对象,用它去调用相应的方法
    QueryRunner queryRunner = new QueryRunner();
    // 定义 sql 语句
    String sql = "select name from actor where id = ?";
    // 调用查询方法
    Object query = queryRunner.query(connection, sql, new ScalarHandler(), 10);
    // 打印查询信息
    System.out.println(query);
    // 关闭资源
    JDBCUtils_Druid.close(null,connection,null);
}

DML 语句

基本介绍

首先创建 QueryRunner 对象

调用 update(connection,sql,...) 方法,返回的是影响的行数

⭐ 关闭资源:底层会得到 resultset,会在 query 关闭,其次还会得到 preparedStatment 对象并关闭,只需要关闭 connection 即可

参数说明

connection:可以利用 JDBCUtils_Druid 获取连接

sql:传入需要执行的 sql 语句

... :这是可变参数,当 sql 语句中有多个 ? 时,这个时候就可以填多个值,和 ? 一一对应

示例代码

java
public static void query() throws Exception {

    // 获取连接
    Connection connection = JDBCUtils_Druid.getConnection();
    // 获取 QueryRunner 对象,用它去调用相应的方法
    QueryRunner queryRunner = new QueryRunner();
    // 定义 sql 语句
    String sql = "insert into actor values (null,'john502','男')";
    // 调用查询方法
    int rows = queryRunner.update(connection,sql);
    // 判断是否执行
    if (rows > 0) {
        System.out.println("执行成功");
    } else {
        System.out.println("执行失败");
    }
    // 关闭资源
    JDBCUtils_Druid.close(null, connection, null);
}