当前位置: 首页 > 图灵资讯 > 技术篇> Apache-DBUtils

Apache-DBUtils

来源:图灵教育
时间:2023-05-29 14:08:28

1.Apache—DBUtils84661.1首先分析一个问题846

1.关闭connection后,resultset结果集无法使用

2.resultset不利于数据管理

3.示意图

Apache-DBUtils_DBUtils

1.2用自己的土方法解决847com中的代码.stulzl.dbutils_My_DBUtils

package com.stulzl.dbutils_;import com.stulzl.jdbcutils_druid.JDBCUtils_Druid;import org.junit.jupiter.api.Test;import java.sql.*;import java.util.ArrayList;///用自己的土方法解决将Resultset封装到的问题 ArrayList    847public class My_DBUtils {    ////用自己的土方法解决问题  847    @Test    public void /*ArrayList*/ testSelectToArrayList(){        System.out.println(使用druid工具类完成);        //1.连接        Connection connection = null;        //2.组织sql语句        String sql = "select * from actor where id>=?";        PreparedStatement preparedStatement=null;        ResultSet set = null;        //创建ArrayList集合,因为我们需要将Resultset封装到 ArrayList存储actor对象        ArrayList list = new ArrayList<>();        try {            connection = JDBCUtils_Druid.getConnection();            /3.创建preparedStatent对象            preparedStatement = connection.prepareStatement(sql);            //4. 给占位符赋值            preparedStatement.setInt(1,1);            //执行,得到结果集            set = preparedStatement.executeQuery();            ///遍历结果集            while(set.next()){                int id = set.getInt("id");//这里提示(”id可以直接写,也可以写数字(按相应顺序)                String name = set.getString("name");                String sex = set.getString("sex");                Date borndate = set.getDate("borndate");                String phone = set.getString("phone");                //得到的 resultset 的记录,封装到 Actor 对象,放入 list 集合                list.add(new Actor(id,name,sex,borndate,phone));            }            System.out.println(list集合数据=”+list);            //集合数据进行遍历集合            for(Actor actor:list){                System.out.println("id=" + actor.getId() + "\t" + actor.getName());            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            ///关闭资源            JDBCUtils_Druid.close(set,preparedStatement,connection);        }        //因为 ArrayList 和 connection 没有任何相关性,因此该集合可以重用.        //return list;    }}

Actor类

package com.stulzl.dbutils_;import java.util.Date;//Actor对象和actor表记录对应   847public class Actor {    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 + '\'' +                '}';    }}

1.3基本介绍848

1.commonsdbutils是Apache组织提供的开源JDBC工具库,是JDBC的封装,

使用dbutils可以大大简化jdbc编码的工作量。

Dbutils类

1.QueryRunner:SQL的执行是安全的。可实现增加、删除、更改、检查、批处理

2.使用QueryRunner类实现查询

ResultsetHandler接口:用于处理java.sql.ResultSet,将数据按要求转换为另一种形式

Apache-DBUtils_封装_02

1.4应用实例848-851

使用DBUtils+数据连接池(德鲁伊)完成表actor的crud

Apache-DBUtils_DBUtils_03

com中的代码.stulzl.dbutils_DBUtils_USE

package com.stulzl.dbutils_;import com.stulzl.jdbcutils_druid.JDBCUtils_Druid;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.apache.commons.dbutils.handlers.ScalarHandler;import org.junit.jupiter.api.Test;import java.sql.Connection;import java.sql.SQLException;import java.util.List;//使用DBUTilss +数据连接池(德鲁伊),crud完成表actor   848public class DBUtils_USE {    @Test    public void testQueryMany() throws SQLException {///返回结果是多行情况        //1. 用druid连接        Connection connection = JDBCUtils_Druid.getConnection();        //2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project        //3. 创建 QueryRunner        QueryRunner queryRunner = new QueryRunner();        //4. 相关方法可以实施,返回 ArrayList 结果集        String sql = "select * from actor where id >= ?";        // 注意: sql 语句也可以查询部分列列        //String sql = "select id, name from actor where id >= ?";        // 老韩解读        //(1) query 方法是执行 sql 语句,得到 resultset --->封装到 --> ArrayList 集合中        //(2) 返回集合        //(3) connection: 连接        //(4) sql : 执行的 sql 语句        //(5) new BeanListHandler<>(Actor.class): (多行多列)在将 resultset -> Actor 对象 ->        //  封装到 ArrayList 底层采用反射机制(Actor.class) 去获取 Actor 类的属性,然后包装        //(6) 1 就是给 sql 语句中的 ? 赋值可以有多个值,因为它是可变参数 Object... params        //(7) 底层得到的 resultset ,会在 query方法 关闭, 也会关闭 Preparedstatment预处理        List list =                queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);        System.out.println(“输出集信息”);        for (Actor actor : list) {            System.out.print(actor);        }        ///释放资源        JDBCUtils_Druid.close(null,null,connection);    }    //演示 apache-dbutils + druid 完成返回的结果集是单行记录(单个对象)   840    @Test    public void testQuerySingle() throws SQLException {        //1. 用druid连接        Connection connection = JDBCUtils_Druid.getConnection();        //2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project        //3. 创建 QueryRunner        QueryRunner queryRunner = new QueryRunner();        //4. 可以执行相关方法        String sql = "select * from actor where id = ?";        // 因为我们返回的单行记录<--->单个对象-单行多列是一行数据 , 使用的是 BeanHandler返回 单个对象        Actor actor = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class), 3);        System.out.println(actor);//输出        ///释放资源        JDBCUtils_Druid.close(null,null,connection);    }    //演示 apache-dbutils + druid 查询结果是单行单列-返回 object    @Test    public void testScalar() throws SQLException {        //1. 用druid连接        Connection connection = JDBCUtils_Druid.getConnection();        //2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project        //3. 创建 QueryRunner        QueryRunner queryRunner = new QueryRunner();        //4. 可以执行相关方法        String sql = "select name from actor where id = ?";        //解读: 因为返回是一个对象——单行单列是一个数据, 使用的 handler 就是 ScalarHandler        Object obj = queryRunner.query(connection, sql, new ScalarHandler(), 3);        System.out.println(obj);        ///释放资源        JDBCUtils_Druid.close(null,null,connection);    }    //演示 apache-dbutils + druid 完成 dml (update, insert ,delete)    @Test    public void testDML() throws SQLException {        //1. 用druid连接        Connection connection = JDBCUtils_Druid.getConnection();        //2. 使用 DBUtils 类和接口 , 先引入 DBUtils 相关的 jar , 加入到本 Project        //3. 创建 QueryRunner        QueryRunner queryRunner = new QueryRunner();        //组织sql语句        //String sql = "update actor set name=? where id=? where id=?";        //String sql = "insert into actor values(null, ?, ?, ?, ?)";        String sql = "delete from actor where id = ?";        //int affectedRow = queryRunner.update(connection, sql, “张三丰”, 3);        //int affectedRow = queryRunner.update(connection, sql,“林青霞”, "女", "1966-10-10", "116");        int affectedRow = queryRunner.update(connection, sql, 2);        System.out.println(affectedRow > 0 ? “成功执行” : “执行不影响表”;        ///释放资源        JDBCUtils_Druid.close(null,null,connection);    }}

1.5表与JavaBean的类型映射关系851

Apache-DBUtils_封装_04