轻量框架之DBUtils

Dbutils:

从字面意思可以理解为:通用的数据库工具类。

Apache组织提供的一个开源JDBC工具类库,对传统操作数据库的类进行二次封装,可以把结果集转化成List。

下载jar包:http://mvnrepository.com/
commons.dbutils.jar


    概述:
        简介:是一种很薄的封装,轻量级的框架
        优点:方便,好用。
    commons-dbutils:能够极大简化jdbc编码的工作量。
    hibernate:一种面向对象的重量级框架,

    Mybatis:一种比较好用的轻量型框架。


    
    三个API(都是接口,主要依靠底层的实现子类):
        org.apache.commons.dbutils.QueryRunner ;    查询器
        org.apache.commons.dbutils.ResultSetHandler ;   结果处理器
        org.apache.commons.dbutils.Dbutils;    普通工具

    

    1.QueryRunner:   增删改查  (线程安全)

        概述:简化了SQL语句
        上代码:
      
        上面这个方法只是阐述了一下原理
        下面是DBUtils的代码:
 

 @Test
        public void testQuery1(){
            //之前做法
            Connection connection = MyDBUtil.getconnection();
            
            //查看API,QueryRunner的构造方法有4个,2个给Oracle,
            //其他两个,一个无参,一个参数为DataSource
            DataSource dataSource = MyDBUtil.getDataSource();
            
            QueryRunner QR = new QueryRunner(dataSource);
            //查看QueryRunner的成员方法,只需要查看query()的重载方法
            //构造方法为一参的有数据源的话,就不用传入connection
            //构造方法为无参构造方法的话,就要传入connection
            
            //查询所有用户,需要返回的是所有User的集合
            users = new ArrayList<>();
            ArrayList<User> users = QR.query("select * from tt_user;",new ResultSetHandler<ArrayList<User>>(){
                @Override
                public ArrayList<User> handle(ResultSet result){
                    while(result.next()){
                        int id = result.getInt("id");
                        String name = result.getString("name");
                        User user = new User(id,name);
                        
                        users.add(user);
                    }
                }
            })    
        }
@Test
        public void testQuery2(){
            DataSource dataSource = MyDBUtil.getDataSource();
            
            QueryRunner QR = new QueryRunner(dataSource);
            ArrayList<User> users = QR.query("select * from tt_user;"
                    ,new BeanListHandler<User>(User.class){

            (因为使用了反射,需要:
                一个无参构造方法,getter和sertter方法,字段名和表名必须相同,因为使用了反射)
        }
        DBUtils 可以自动为我们封装结果集映射,但是需要我们的javaBean
                        (就是我们自己封装的和数据库表相同的列的字段名)符合javaBean的规范
        无参构造,字段名跟表的列名必须完全对应(如果bean里没有表里的字段,则不会赋值,
                                               如果bean里有这个字段,表里没有对应列,则这个字段为bean的初始值)

        
           
 public void testQuery3(){
            DataSource dataSource = MyDBUtil.getDataSource();
            
            QueryRunner QR = new QueryRunner(dataSource);
            ArrayList<User> users = QR.query("select * from tt_user where age > ?;"
                    ,new BeanListHandler<User>(User.class),23);{
                //返回查询的结果集(age > 23);不用考虑是否是int,String,不需要考虑''。
            }
        }    
        
    public void testInsert1(){
            DataSource dataSource = MyDBUtil.getDataSource();
            
            QueryRunner QR = new QueryRunner(dataSource);
            int update = QR.update("insert into tt_user values(null,'aaa','bb'...)");
                Assert.asserEquals(1,update);
                //断言,用来判断条件是否满足,不满足就会报错
            }        
    }    
    
    插入一条记录
    public void testInsert3(){
            DataSource dataSource = MyDBUtil.getDataSource();
            
            QueryRunner QR = new QueryRunner(dataSource);
            
            User user = new User(传参);
            int update = QR.update(
            "insert into tt_user values(null,?,?,?,?)"),
            user.getUsername(),
            user.getId()...可变参数列表
            );
                Assert.asserEquals(1,update);
                //断言,用来判断条件是否满足,不满足就会报错
            }        
    }    
    批处理插入用户:batch(sql , object[][] object)
    二维数组的表示:
    public void testInsert4(){
            DataSource dataSource = MyDBUtil.getDataSource();
            
            QueryRunner QR = new QueryRunner(dataSource);
            
            User user1 = new User(1,"aaa"...);
            User user2 = new User(2,"bbb"...);
            User user3 = new User(3,"cccc"...);
            
            new ArrayList<>();
            arr.add(user1);arr.add(user2);
            new Object[3][];
            
            ..........
            
            int update = QR.batch(
            "insert into tt_user values(null,?,?,?,?)"),
            
            );
                Assert.asserEquals(1,update);
                //断言,用来判断条件是否满足,不满足就会报错
            }        
    }

   

    2.ResultSetHandler : 结果集处理器

        概述:对结果集的具体实现的一些API。
        用它的一些实现类:ArrayHandler、BeanHandler/BeanListHandler、ScalarHandler
        

        几个实现类的东西:

    @Test
    public void test1() throws SQLException {
        //统一的两句语法:
        ComboPooledDataSource dataSource = C3P0Utils.getDataSource();
        QueryRunner queryRunner = new QueryRunner(dataSource);
   
        //1.ArrayHandler
        Object[] query = queryRunner.query("select * from tt_user where id = ?",
                new ArrayHandler(), 5);


        //2.ArrayListHandler
        List<Object[]> query = queryRunner.query("select * from tt_user ",
                new ArrayListHandler());
  
         //3.BeanHandler
        User query = queryRunner.query("select * from tt_user ",
                new BeanHandler<User>(User.class));

        //4.BeanListHandler
        User query = queryRunner.query("select * from tt_user ",
                new BeanListHandler<User>(User.class));

   
        //5.ColumnListHandler
        List<Object> column_ = queryRunner.query("select username from tt_user ",
                new ColumnListHandler());

        //6.KeyedHandler
        Map<Object, Map<String, Object>> query = queryRunner.query("select * from tt_user ",
                new KeyedHandler());

        //7.MapHandler 把预期的一行的数据,封装到一个map里
            Map<String, Object> query =
                queryRunner.query("select * from tt_user ",new MapHandler());

        //8.MapListHandler 把预期的多行的数据,封装到多个map里
        List<Map<String, Object>> query = queryRunner.query("select * from tt_user ",
                new MapListHandler());

        //9.ScalarHandler 把预期的多行的数据,封装到多个map里
        Object query = queryRunner.query(connection,"select count(*) from tt_user ",
                new ScalarHandler());

    }

首先要明确的就是,这个处理器主要就是对结果集进行处理,



3.Dbutils

没啥好讲的,方法主要是close()、loadDriver()、等,具体查看官方文档
https://commons.apache.org/proper/commons-dbutils/index.html

Some of the advantages of using DbUtils are:

  • No possibility for resource leaks. Correct JDBC coding isn't difficult but it is time-consuming and tedious. This often leads to connection leaks that may be difficult to track down.
  • Cleaner, clearer persistence code. The amount of code needed to persist data in a database is drastically reduced. The remaining code clearly expresses your intention without being cluttered with resource cleanup.
  • Automatically populate JavaBean properties from ResultSets. You don't need to manually copy column values into bean instances by calling setter methods. Each row of the ResultSet can be represented by one fully populated bean instance.







猜你喜欢

转载自blog.csdn.net/qq_38962004/article/details/80355683