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);
}