TxQueryRunner

TxQueryRunner类是common-dbutils下QueryRunner类的子类,用来简化JDBC操作。TxQueryRunner类内部使用了JdbcUtils.getConnection()类来获取连接对象,以及使用JdbcUtils.releaseConnection()关闭连接。

  • int[] batch(String sql, Object[][] params):执行批处理,参数sql是SQL语句模板,params为参数;
  • T query(String sql, ResultSetHandler<T> rh):执行查询,执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果;
  • T query(String sql, ResultSetHandler<T> rh, Object… params):执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果,params是sql语句的参数;
  • int update(String sql):执行增、删、改语句,参数sql是要执行的SQL语句;
  • int update(Stringsql, Object param):执行增、删、改语句,参数sql是要执行的SQL语句,参数param是参数(一个参数);
  • int update(String sql, Object… params):执行增、删、改语句,参数sql是要执行的SQL语句,参数params是参数(多个参数);

为了测试TxQueryRunner,在test数据库下创建person表:

表person:

image

测试代码:

测试update方法
public class TxQueryRunnerTest {
    /**
     * 测试update方法
     * @throws SQLException
     */
    @Test
    public void testUpdate() throws SQLException {
        String sql="insert into person(pid, pname, age) values(?,?,?)";
        Object[] params = {"1","p1", "18"};//给sql中对应的参数
        QueryRunner qr = new TxQueryRunner();//没有给对象提供连接池
        qr.update(sql, params);
        
    }
    //使用事务
    @Test
    public void testUpade2() throws Exception{
        try {
            JdbcUtils.beginTransaction();
            
            String sql="insert into person(pid, pname, age) values(?,?,?)";
            QueryRunner qr = new TxQueryRunner();
            
            Object[] params = {"2","p2", "18"};
            qr.update(sql,params);//执行
            
            /*取消注释,演示抛出异常时,事件回滚情况
            if(true){
                throw new Exception();
            }
            */
            
            params = new Object[]{"3","p3", "18"};
            qr.update(sql, params);//执行
            
            JdbcUtils.commitTransaction();//提交事务
        } catch (Exception e) {
            try {
                JdbcUtils.rollbackTransaction();//回滚事件
            } catch (SQLException e1) {
            }
            /*throw e;*/
        }
    }
}

执行结果

image

测试query方法
public class TxQueryRunnerTest {
    /**
     * 测试查询方法
     * 我们知道jdbc查询的结果是ResultSet
     * 而QueryRunner查询的结果是通过ResultSet映射后的数据。
     *         QueryRunner第一步是执行select,得到ResultSet
     *         把ResultSet转换成其他类型
     * 通过转换结果:
     *         JavaBean:把结果集封装到JavaBean中
     *         Map:把结果集封装到Object中(结果集是当行单列)
     * @throws SQLException 
     * 
     */
    //单行结果集映射到javaBean中
    @Test
    public void testQuery1() throws SQLException{
        String sql = "select * from person where pid=?";
        QueryRunner qr = new TxQueryRunner();
        /*
         * 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型
         * BeanHandler → 它是ResultSetHandler的实现类,它的作用是把结果集封装到person对象中
         * 注意:结果集的列名与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 person";
        QueryRunner qr = new TxQueryRunner();
        /*
         * 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型
         * BeanHandler → 它是ResultSetHandler的实现类,
         * 它的作用是把结果集封装到List<person>对象中
         * 注意:结果集的列名与person的属性名必须相同
         */
        List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
        System.out.println(list);
    }
    
}

testQuery1()

image

testQuery2()

image

public class TxQueryRunnerTest {
    /**
     * 使用BeanListhandler
     * 把单行结果集映射到Map对象中
     * @throws SQLException 
     */
    @Test
    public void testQuery3() throws SQLException {
        String sql = "select * from person where pid=?";
        QueryRunner qr = new TxQueryRunner();
    
        Map<String,Object> map = qr.query(sql, new MapHandler(),"1");
        System.out.println(map);
    }
    /**
     * 使用BeanListhandler
     * 把多行结果集封装到List<Map>,即多个Map对象
     * 一行对应一个Map对象,多行就对应List<Map>
     * @throws SQLException 
     */
    @Test
    public void testQuery4() throws SQLException {
        String sql = "select * from person";
        QueryRunner qr = new TxQueryRunner();
        
        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 person";//结果集是单行单列
        QueryRunner qr = new TxQueryRunner();
        
        Object obj = qr.query(sql, new ScalarHandler());
        /*
         * 我们知道select count(*),结果一定是个整数!
         * >Integer
         * >Long
         * >BigInteger
         * 
         * 不同的驱动,结果不同!
         * 无论是哪种类型,它都是Number类型,强转化成Number一定不出错
         */
        Number number = (Number)obj;
        long cnt = number.longValue();
        System.out.println(cnt);
    }
}

testQuery3()

image

testQuery4()

image

testQuery5()

image

原文地址:https://www.cnblogs.com/suxiaoxia/p/6833231.html