五十四、DBUtils

如果只使用JDBC進(jìn)行開發(fā),我們會發(fā)現(xiàn)冗余代碼過多,為了簡化JDBC開發(fā),本案例我們講采用apache commons組件一個(gè)成員:DBUtils。

DBUtils就是JDBC的簡化開發(fā)工具包。需要項(xiàng)目導(dǎo)入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。


commons-dbutils-1.6.jar

DBUtils是java編程中的數(shù)據(jù)庫操作實(shí)用工具,小巧簡單實(shí)用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼。
Dbutils三個(gè)核心功能介紹:

  • QueryRunner中提供對sql語句操作的API.
  • ResultSetHandler接口,用于定義select操作后,怎樣封裝結(jié)果集.
  • DbUtils類,它就是一個(gè)工具類,定義了關(guān)閉資源與事務(wù)處理的方法

DbUtils類核心方法
closeQuietly(Connection conn) 關(guān)閉連接,如果有異常try后不拋。
commitAndCloseQuietly(Connection conn) 提交并關(guān)閉連接
rollbackAndCloseQuietly(Connection conn) 回滾并關(guān)閉連接

QueryRunner核心類
update(Connection conn, String sql, Object... params),用來完成表數(shù)據(jù)的增加、刪除、更新操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數(shù)據(jù)的查詢操作

一、QueryRunner實(shí)現(xiàn)添加、更新、刪除操作

update(Connection conn, String sql, Object... params),用來完成表數(shù)據(jù)的增加、刪除、更新操作

  • 添加
public void insert(){

   try {

   //獲取一個(gè)用來執(zhí)行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);// 用來完成表數(shù)據(jù)的增加、刪除、更新操作

   //結(jié)果集處理

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

   } catch(SQLException e) {

     throw new RuntimeException(e);

 }

}
  • 更新
public void update(){

   try{

     //創(chuàng)建一個(gè)QueryRunner對象,用來完成SQL語句的執(zhí)行

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

     //執(zhí)行SQL語句

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

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

     Connection conn = JDBCUtils.*getConnection*();

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

     //結(jié)果集的處理

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

   } catch (SQLException e) {

     throw new RuntimeException(e);

 }

}
  • 刪除
public void delete(){

   try{

     //創(chuàng)建一個(gè)QueryRunner對象,用來完成SQL語句的執(zhí)行

     QueryRunner qr = new QueryRunner();

     //執(zhí)行SQL語句

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

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

     Connection conn = JDBCUtils.getConnection();

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

     //結(jié)果集的處理

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

   } catch(SQLException e) {

     throw new RuntimeException(e);

 }

}

二、QueryRunner實(shí)現(xiàn)查詢操作

需要用到的類和方法:

  • query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數(shù)據(jù)的查詢操作

  • ResultSetHandler結(jié)果集處理類

處理類 作用介紹
ArrayHandler 將結(jié)果集中的第一條記錄封裝到一個(gè)Object[]數(shù)組中,數(shù)組中的每一個(gè)元素就是這條記錄中的每一個(gè)字段的值
ArrayListHandler 將結(jié)果集中的每一條記錄都封裝到一個(gè)Object[]數(shù)組中,將這些數(shù)組在封裝到List集合中。
BeanHandler 將結(jié)果集中第一條記錄封裝到一個(gè)指定的javaBean中。
BeanListHandler 將結(jié)果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
ColumnListHandler 將結(jié)果集中指定的列的字段值,封裝到一個(gè)List集合中
ScalarHandler 它是用于單數(shù)據(jù)。例如select count(*) from 表操作。
MapHandler 將結(jié)果集中第一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值
MapListHandler 將結(jié)果集中每一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值,在將這些Map封裝到List集合中。

JavaBean
JavaBean就是一個(gè)類,在開發(fā)中常用語封裝數(shù)據(jù)。具有如下特性:

  1. 需要實(shí)現(xiàn)接口:java.io.Serializable ,通常實(shí)現(xiàn)接口這步驟省略了,不會影響程序。
  2. 提供私有字段:private 類型 字段名;
  3. 提供getter/setter方法:
  4. 提供無參構(gòu)造

創(chuàng)建一個(gè)JavaBean,用來封裝處理類返回的數(shù)據(jù):

/*
 * 賬務(wù)類
 */
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:將結(jié)果集中的第一條記錄封裝到一個(gè)Object[]數(shù)組中,數(shù)組中的每一個(gè)元素就是這條記錄中的每一個(gè)字段的值
public class ArrayHandlerDemo {
    
    @Test
    public void method(){
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();
            //執(zhí)行SQL語句
            String sql = "SELECT * FROM zhangwu";
            Object[] params = {};
            Connection conn = JDBCUtils.getConnection();
            Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
            //結(jié)果集的處理
            System.out.println( Arrays.toString(objArray) );
            
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  1. ArrayListHandler:將結(jié)果集中的每一條記錄都封裝到一個(gè)Object[]數(shù)組中,將這些數(shù)組在封裝到List集合中。
public class ArrayListHandlerDemo {
    @Test
    public void method(){
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();
            //執(zhí)行SQL語句
            String sql = "SELECT * FROM zhangwu WHERE money>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils.getConnection();
             List<Object[]> list = qr.query(conn, sql, new ArrayListHandler(), params);
            //結(jié)果集的處理
             for (Object[] objArray : list) {
                System.out.println(  Arrays.toString(objArray) );
            }
            
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • BeanHandler與BeanListHandler查詢

    1. BeanHandler :將結(jié)果集中第一條記錄封裝到一個(gè)指定的javaBean中。
public class BeanHandlerDemo {
    @Test
    public void method(){
        try{
            //獲取QueryRunner 
            QueryRunner qr = new QueryRunner();
            //執(zhí)行SQL語句
            String sql = "SELECT * FROM zhangwu WHERE id=?";
            Object[] params = {1};
            Connection conn = JDBCUtils.getConnection();
            ZhangWu zw = qr.query(conn, sql, new BeanHandler<ZhangWu>(ZhangWu.class), params);
            //結(jié)果集處理
            System.out.println(zw);         
            conn.close();
        } catch(SQLException e){
            throw new RuntimeException(e);
        }
    }
}
  1. BeanListHandler :將結(jié)果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
public class BeanListHandlerDemo {
    @Test
    public void method(){
        try{
            //獲取QueryRunner 
            QueryRunner qr = new QueryRunner();
            //執(zhí)行SQL語句
            String sql = "SELECT * FROM zhangwu WHERE money>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils.getConnection();
            List<ZhangWu> list = qr.query(conn, sql, new BeanListHandler<ZhangWu>(ZhangWu.class), params);
            //結(jié)果集處理
            for (ZhangWu zw : list) {
                System.out.println(zw);
            }
            conn.close();
        } catch(SQLException e){
            throw new RuntimeException(e);
        }
    }
}
  • ColumnListHandler與ScalarHandler查詢

    1. ColumnListHandler:將結(jié)果集中指定的列的字段值,封裝到一個(gè)List集合中
public class ColumnListHandlerDemo {
    @Test
    public void method(){
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();
            //執(zhí)行SQL語句
            String sql = "SELECT name FROM zhangwu WHERE money>?";
            Object[] params = {2000};
            Connection conn = JDBCUtils.getConnection();
            List<String> list = qr.query(conn, sql, new ColumnListHandler<String>(), params); 
            //結(jié)果集的處理
            for (String str : list) {
                System.out.println(str);
            }
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  1. ScalarHandler:它是用于單數(shù)據(jù)。例如select count(*) from 表操作。
public class ScalarHandlerDemo {
    @Test
    public void method(){
        try {
            //獲取QueryRunner對象
            QueryRunner qr = new QueryRunner();         
            //執(zhí)行SQL語句
            String sql = "SELECT MAX(money) FROM zhangwu";
            Object[] params = {};
            Connection conn = JDBCUtils.getConnection();
            Double max = qr.query(conn, sql, new ScalarHandler<Double>(), params);
            //結(jié)果集的處理
            System.out.println("max=" + max);           
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容