五十四、DBUtils

如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils

DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。


commons-dbutils-1.6.jar

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍:

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

DbUtils类核心方法
closeQuietly(Connection conn) 关闭连接,如果有异常try后不抛。
commitAndCloseQuietly(Connection conn) 提交并关闭连接
rollbackAndCloseQuietly(Connection conn) 回滚并关闭连接

QueryRunner核心类
update(Connection conn, String sql, Object... params),用来完成表数据的增加、删除、更新操作
query(Connection conn, String sql, ResultSetHandler rsh, Object... params) ,用来完成表数据的查询操作

一、QueryRunner实现添加、更新、删除操作

update(Connection conn, String sql, Object... params),用来完成表数据的增加、删除、更新操作

  • 添加
public void insert(){

   try {

   //获取一个用来执行SQL语句的对象 QueryRunner

     QueryRunner qr = new QueryRunner();

     String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)";

     Object[] params = {"股票收入", 5500, "收入"};

     Connection conn = JDBCUtils.getConnection*();

     int line = qr.update(conn,sql,params);// 用来完成表数据的增加、删除、更新操作

   //结果集处理

     System.out.println("line = " + line);

   } catch(SQLException e) {

     throw new RuntimeException(e);

 }

}
  • 更新
public void update(){

   try{

     //创建一个QueryRunner对象,用来完成SQL语句的执行

     QueryRunner qr = **new** QueryRunner();

     //执行SQL语句

     String sql = "UPDATE zhangwu SET money = money+1000 WHERE name=?";

     Object[] params = {"股票收入"};

     Connection conn = JDBCUtils.*getConnection*();

     int line = qr.update(conn, sql, params);

     //结果集的处理

     System.out.println("line="+line);

   } catch (SQLException e) {

     throw new RuntimeException(e);

 }

}
  • 删除
public void delete(){

   try{

     //创建一个QueryRunner对象,用来完成SQL语句的执行

     QueryRunner qr = new QueryRunner();

     //执行SQL语句

     String sql = "DELETE FROM zhangwu WHERE name = ?";

     Object[] params = {"股票收入"};

     Connection conn = JDBCUtils.getConnection();

     int line = qr.update(conn, sql, params);

     //结果集的处理

     System.out.println("line="+line);

   } catch(SQLException e) {

     throw new RuntimeException(e);

 }

}

二、QueryRunner实现查询操作

需要用到的类和方法:

  • query(Connection conn, String sql, ResultSetHandler rsh, Object... params) ,用来完成表数据的查询操作

  • ResultSetHandler结果集处理类

处理类 作用介绍
ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
ScalarHandler 它是用于单数据。例如select count(*) from 表操作。
MapHandler 将结果集中第一条记录封装到了Map集合中,key就是字段名称,value就是字段值
MapListHandler 将结果集中每一条记录封装到了Map集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。

JavaBean
JavaBean就是一个类,在开发中常用语封装数据。具有如下特性:

  1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
  2. 提供私有字段:private 类型 字段名;
  3. 提供getter/setter方法:
  4. 提供无参构造

创建一个JavaBean,用来封装处理类返回的数据:

/*
 * 账务类
 */
public class ZhangWu {
    private int id;
    private String name;
    private double money;
    private String parent;

    public ZhangWu() {
        super();
    }
    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 double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public String getParent() {
        return parent;
    }
    public void setParent(String parent) {
        this.parent = parent;
    }

    @Override
    public String toString() { //该方法可以省略
        return "ZhangWu [id=" + id + ", name=" + name + ", money=" + money + ", parent=" + parent + "]";
    }
}
  • ArrayHandler与ArrayListHandler查询

    1. ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
public class ArrayHandlerDemo {
    
    @Test
    public void method(){
        try {
            //获取QueryRunner对象
            QueryRunner qr = new QueryRunner();
            //执行SQL语句
            String sql = "SELECT * FROM zhangwu";
            Object[] params = {};
            Connection conn = JDBCUtils.getConnection();
            Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
            //结果集的处理
            System.out.println( Arrays.toString(objArray) );
            
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  1. ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
public class ArrayListHandlerDemo {
    @Test
    public void method(){
        try {
            //获取QueryRunner对象
            QueryRunner qr = new QueryRunner();
            //执行SQL语句
            String sql = "SELECT * FROM zhangwu WHERE money>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils.getConnection();
             List list = qr.query(conn, sql, new ArrayListHandler(), params);
            //结果集的处理
             for (Object[] objArray : list) {
                System.out.println(  Arrays.toString(objArray) );
            }
            
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • BeanHandler与BeanListHandler查询

    1. BeanHandler :将结果集中第一条记录封装到一个指定的javaBean中。
public class BeanHandlerDemo {
    @Test
    public void method(){
        try{
            //获取QueryRunner 
            QueryRunner qr = new QueryRunner();
            //执行SQL语句
            String sql = "SELECT * FROM zhangwu WHERE id=?";
            Object[] params = {1};
            Connection conn = JDBCUtils.getConnection();
            ZhangWu zw = qr.query(conn, sql, new BeanHandler(ZhangWu.class), params);
            //结果集处理
            System.out.println(zw);         
            conn.close();
        } catch(SQLException e){
            throw new RuntimeException(e);
        }
    }
}
  1. BeanListHandler :将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
public class BeanListHandlerDemo {
    @Test
    public void method(){
        try{
            //获取QueryRunner 
            QueryRunner qr = new QueryRunner();
            //执行SQL语句
            String sql = "SELECT * FROM zhangwu WHERE money>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils.getConnection();
            List list = qr.query(conn, sql, new BeanListHandler(ZhangWu.class), params);
            //结果集处理
            for (ZhangWu zw : list) {
                System.out.println(zw);
            }
            conn.close();
        } catch(SQLException e){
            throw new RuntimeException(e);
        }
    }
}
  • ColumnListHandler与ScalarHandler查询

    1. ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中
public class ColumnListHandlerDemo {
    @Test
    public void method(){
        try {
            //获取QueryRunner对象
            QueryRunner qr = new QueryRunner();
            //执行SQL语句
            String sql = "SELECT name FROM zhangwu WHERE money>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils.getConnection();
            List list = qr.query(conn, sql, new ColumnListHandler(), params); 
            //结果集的处理
            for (String str : list) {
                System.out.println(str);
            }
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  1. ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
public class ScalarHandlerDemo {
    @Test
    public void method(){
        try {
            //获取QueryRunner对象
            QueryRunner qr = new QueryRunner();         
            //执行SQL语句
            String sql = "SELECT MAX(money) FROM zhangwu";
            Object[] params = {};
            Connection conn = JDBCUtils.getConnection();
            Double max = qr.query(conn, sql, new ScalarHandler(), params);
            //结果集的处理
            System.out.println("max=" + max);           
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(五十四、DBUtils)