zoukankan      html  css  js  c++  java
  • java操作数据库增删改查的小工具1--TxQueryRunner

    在java程序中,一般使用jdbc连接数据库,比较麻烦,在看传智教程时学了一个工具类,用于简化与数据库之间的操作步骤,就是TxQueryRunner,他是QueryRunner的子类,用起来和他是一样的,特点是支持事务,使用时需要导入几个jar包,分别是

    :

    这个工具类的优点基本上就是阿帕奇出的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);
        }
    }
  • 相关阅读:
    [Java123] JDBC and Multi-Threading 多线程编程学习笔记
    3:2D装换 [ 重点 ]
    2:属性选择器 + 结构伪类选择器 + 伪元素
    1:新增 H5 常用属性
    day2
    代码实操第一天
    1 滑动门
    css高级技巧
    11:网页布局总结
    10:定位
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5149113.html
Copyright © 2011-2022 走看看