天天看點

java操作資料庫增删改查的小工具1--TxQueryRunner

在java程式中,一般使用jdbc連接配接資料庫,比較麻煩,在看傳智教程時學了一個工具類,用于簡化與資料庫之間的操作步驟,就是TxQueryRunner,他是QueryRunner的子類,用起來和他是一樣的,特點是支援事務,使用時需要導入幾個jar包,分别是

:

java操作資料庫增删改查的小工具1--TxQueryRunner
這個工具類的優點基本上就是阿帕奇出的DBUtils架構裡邊所具有的特點,極大簡化操作者的代碼量,底層使用c3p0連接配接池,可以友善的吧資料庫查詢出來的結果映射到JavaBean,List,Map等中,以下是筆記及代碼:

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

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.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import cn.itcast.commons.CommonUtils;
import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.TxQueryRunner;

/**
 * TxQueryRunner它是QueryRunner的子類!(commons-dbutils.jar)
 *   可用起來與QueryRunner相似的!
 *   我們的類支援事務!它底層使用了JdbcUtils來擷取連接配接!
 *   
 * 簡化jdbc的操作
 * QueryRunner的三個方法:
 * * update() --> insert、update、delete
 * * query() --> select
 * * batch() --> 批處理
 * @author qdmmy6
 *
 */
public class TxQueryRunnerTest {
    /**
     * 測試update()方法,用來執行insert、update、delete語句
     * @throws SQLException
     */
    @Test
    public void testUpdate() throws SQLException {
        String sql = "insert into t_person(pid,pname,age,sex) values(?,?,?,?)";
        Object[] params = {"1", "p1", 1, "男"};//給sql中對應的參數
        
        QueryRunner qr = new TxQueryRunner();//我們沒有給對象提供連接配接池
        qr.update(sql, params);//執行sql,也不提供連接配接,它内部會使用JdbcUtils來擷取連接配接
    }
    
    /**
     * 使用事務
     * @throws SQLException
     */
    @Test
    public void testUpdate2() throws Exception {
        try {
            JdbcUtils.beginTransaction();//開啟事務
            
            String sql = "insert into t_person(pid,pname,age,sex) values(?,?,?,?)";
            QueryRunner qr = new TxQueryRunner();
            Object[] params = {"2", "p2", 2, "女"};
            qr.update(sql, params);//執行
            
            if(false) {
                throw new Exception();
            }
            
            params = new Object[]{"3", "p3", 3, "女"};
            qr.update(sql, params);//執行            
            
            JdbcUtils.commitTransaction();//送出事務
        } catch(Exception e) {
            try {
                JdbcUtils.rollbackTransaction();//復原事務
            } catch (SQLException e1) {
            }
            throw e;
        }        
    }
    
    /**
     * 測試查詢方法
     *   我們知道JDBC查詢的結果的是ResultSet
     *   而QueryRunner查詢的結果是通過ResultSet映射後的資料。
     *     * QueryRunner第一步是執行select,得到ResultSet
     *     * 把ResultSet轉換成其他類型的!
     *   通過轉換結果:
     *      * javaBean:把結果集封裝到javaBean中
     *      * Map:把結果集封裝到Map中
     *      * 把結果集封裝到Object中(結果集是單行單列)
     * @throws SQLException 
     *      
     *  
     */
    /*
     * 單行結果集映射到javaBean中
     */
    @Test
    public void testQuery1() throws SQLException {
        String sql = "select * from t_person where pid=?";
        QueryRunner qr = new TxQueryRunner();
        /*
         * 第二個參數類型為ResultSetHandler,它是一個接口,表示映射的結果類型。
         * 
         * BeanHandler --> 它是ResultSetHandler的實作類,它的作用是把結果集封裝到Person對象中
         */
        Person p = qr.query(sql, new BeanHandler<Person>(Person.class), "1");
        System.out.println(p);
    }
    
    /**
     * 使用BeanListHandler
     *   把多行結果集映射到List<Bean>,即多個JavaBean對象。
     *   一行結果集記錄對應一個javaBean對象,多行就對應List<Bean>
     * @throws SQLException
     */
    @Test
    public void testQuery2() throws SQLException {
        String sql = "select * from t_person";
        QueryRunner qr = new TxQueryRunner();
        /*
         * 第二個參數類型為ResultSetHandler,它是一個接口,表示映射的結果類型。
         * 
         * BeanListHandler --> 它是ResultSetHandler的實作類,
         *   它的作用是把結果集封裝到List<Person>對象中
         */
        List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
        System.out.println(list);
    }
    
    /**
     * 使用MapHandler,把單行結果集封裝到Map對象中
     * @throws SQLException
     */
    @Test
    public void testQuery3() throws SQLException {
        String sql = "select * from t_person where pid=?";
        QueryRunner qr = new TxQueryRunner();
        /*
         * 第二個參數類型為ResultSetHandler,它是一個接口,表示映射的結果類型。
         * 
         * BeanListHandler --> 它是ResultSetHandler的實作類,
         *   它的作用是把結果集封裝到List<Person>對象中
         */
        Map<String, Object> map = qr.query(sql, new MapHandler(), "1");
        System.out.println(map);
    }
    
    /**
     * 使用MapListHandler,把多行結果集封裝到List<Map>中,即多個Map
     *   一行對應一個Map,多行對應List<Map>
     * @throws SQLException
     */
    @Test
    public void testQuery4() throws SQLException {
        String sql = "select * from t_person";
        QueryRunner qr = new TxQueryRunner();
        /*
         * 第二個參數類型為ResultSetHandler,它是一個接口,表示映射的結果類型。
         * 
         * BeanListHandler --> 它是ResultSetHandler的實作類,
         *   它的作用是把結果集封裝到List<Person>對象中
         */
        List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
        System.out.println(mapList);
    }
    
    /**
     * 使用ScalarHandler,把單行單列的結果集封裝到Object中
     * @throws SQLException
     */
    @Test
    public void testQuery5() throws SQLException {
        String sql = "select count(*) from t_person";//結果集是單行單列的
        QueryRunner qr = new TxQueryRunner();

        Object obj = qr.query(sql, new ScalarHandler());
        /*
         * 我們知道select count(1),結果一定是個整數!
         * > Integer
         * > Long
         * > BigInteger
         * 
         * 不同的驅動,結果不同!
         * 無論是哪種類型,它都是Number類型!強轉成Number一定不出錯
         */
        Number number = (Number)obj;
        long cnt = number.longValue();
        System.out.println(cnt);
    }
}