DBUtils的介绍

    科技2026-08-13  13

    目录

    一、DBUtils简介二、JDBC的一般性流程三个接口总结

    一、DBUtils简介

    JDBC即Java数据库连接,而DBUtils为工具类,是为数据库连接提供简便的,因为在连接过程中,会出现代码重复,可读性不好,而工具类就是把这些重复的地方封装起来,对代码进行简化,可读性也会增强。

    二、JDBC的一般性流程

    加载驱动(Driver Manger) 获得链接(Driver Manger,Connection) 获得执行sql对象(Statement,PreparStatement) 解析结果集(ReslutSet) 释放资源(close()) 在这五个流程中,都可以使用DBUtils来简化代码。

    三个接口

    三个API(都是接口,主要依靠底层的实现子类): org.apache.commons.dbutils.QueryRunner ; 查询器 org.apache.commons.dbutils.ResultSetHandler ; 结果处理器 org.apache.commons.dbutils.Dbutils; 普通工具

    QueryRunner: 增删改查 (线程安全) new QueryRunner(); 它的事务可以手动控制。也就是说此对象调用的方法(如:query、update、batch)参数中要有Connection对象。 new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。 小结:简化了SQL语句

    public void testQuery1(){ //之前做法 Connection connection = MyDBUtil.getconnection(); //查看API,QueryRunner的构造方法有4个,2个给Oracle, //其他两个,一个无参,一个参数为DataSource DataSource dataSource = MyDBUtil.getDataSource(); QueryRunner QR = new QueryRunner(dataSource); //查看QueryRunner的成员方法,只需要查看query()的重载方法 //构造方法为一参的有数据源的话,就不用传入connection //构造方法为无参构造方法的话,就要传入connection //查询所有用户,需要返回的是所有User的集合 users = new ArrayList<>(); ArrayList<User> users = QR.query("select * from tt_user;",new ResultSetHandler<ArrayList<User>>(){ @Override public ArrayList<User> handle(ResultSet result){ while(result.next()){ int id = result.getInt("id"); String name = result.getString("name"); User user = new User(id,name); users.add(user); } } }) }

    ResultSetHandler : 结果集处理器   ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]    ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中    ColumnListHandler:取某一列的数据。封装到List中。    KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。    MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中    MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中    ScalarHandler:适合取单行单列数据    BeanHandler: 将结果集中第一条记录封装到一个指定的javaBean中。    BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中 小结:对结果集的具体实现的一些API。

    public void test1() throws SQLException { //统一的两句语法: ComboPooledDataSource dataSource = C3P0Utils.getDataSource(); QueryRunner queryRunner = new QueryRunner(dataSource); //1.ArrayHandler Object[] query = queryRunner.query("select * from tt_user where id = ?", new ArrayHandler(), 5); //2.ArrayListHandler List<Object[]> query = queryRunner.query("select * from tt_user ", new ArrayListHandler()); //3.BeanHandler User query = queryRunner.query("select * from tt_user ", new BeanHandler<User>(User.class)); //4.BeanListHandler User query = queryRunner.query("select * from tt_user ", new BeanListHandler<User>(User.class)); //5.ColumnListHandler List<Object> column_ = queryRunner.query("select username from tt_user ", new ColumnListHandler()); //6.KeyedHandler Map<Object, Map<String, Object>> query = queryRunner.query("select * from tt_user ", new KeyedHandler()); //7.MapHandler 把预期的一行的数据,封装到一个map里 Map<String, Object> query = queryRunner.query("select * from tt_user ",new MapHandler()); //8.MapListHandler 把预期的多行的数据,封装到多个map里 List<Map<String, Object>> query = queryRunner.query("select * from tt_user ", new MapListHandler()); //9.ScalarHandler 把预期的多行的数据,封装到多个map里 Object query = queryRunner.query(connection,"select count(*) from tt_user ", new ScalarHandler()); }

    DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法,做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。 close():DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭连接、声明和结果(ResultSet)。 LoadDriver(String driveClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。使用loadDrive方法,编码就变得更容易理解,你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。

    总结

    使用DBUtils不可能发生资源泄漏。正确的JDBC编码并不困难,但它既耗时又乏味。这种连接往往很难追踪;更干净、更清晰的持久性代码。在数据库中持久化数据所需的代码量大大减少。剩下的代码清楚地表达了您的意图,而不会被资源清理搞得一团糟;从结果集自动填充JavaBean属性。不需要通过调用setter方法将列值手动复制到bean实例中。ResultSet的每一行都可以由一个完全填充的bean实例表示。

    Processed: 0.030, SQL: 9