DButils使用详解

2012/04/21 3194点热度 0人点赞 0条评论

DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。

在使用DBUtils之前,应该注意一些问题:

   1、DBUtils是JDBC的简单封装,可以和JDBC混合使用。
  2、DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次Bean的getter与setter方法的名字与结果集的列名一一对应,而不要求JavaBean的私有成员与表结果集列名一一对应。

    3、DBUtils可以将结果集封装为各种类型,主要有:Bean/List<Bean>,Map/List<Map>/Map<Map>,数组/List<数组>,列/List<列>,这些类型。
  对于Map<Map>的类型使用KeyedHandler作为结果集处理器,内层的Map是“列名-值"对,外层的Map是“主键-内层Map的引用”,但此处的主键不一定就是数据库的主键,可以随意指定,比如:

ResultSetHandler h = new KeyedHandler("id");
Map found = (Map) queryRunner.query("select id, name, age from person", h);
Map jane = (Map) found.get(new Long(1)); // jane's id is 1
String janesName = (String) jane.get("name");
Integer janesAge = (Integer) jane.get("age");

    4、DBUtils执行插入操作的时候,无法返回自增主键,这是一个很严重的问题,当然不能怪DBUtils,可以通过变通的方法来实现,比如在MySQL中,执行完了一个插入SQL后,接着执行SELECT LAST_INSERT_ID()语句,就可以获取到自增主键。
  5、DBUtils的性能和JDBC性能是一样,测试过程中没发现性能损失,拥有了很高性能的同时,而不失JDBC的灵活性。
  6、对于JavaBean的成员类型定义,有一条原则那就是:尽可能使用包装类型,而不要使用基本类型。如果数据库中的值为null,那么将会报错.

常用:

ArrayHandler //把结果集中的第一行数据转成对象数组。
ArrayListHandler //把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler //将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler //将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler //将结果集中某一列的数据存放到List中。
KeyedHandler //将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。
MapHandler //将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler //将结果集中的每一行数据都封装到一个Map里,然后再存放到List。
ScalarHandler //将结果集中某一条记录的其中某一列的数据存成Object。

增删改案例:

@Test
    public void add(){
        Connection conn=null;
        try {
            //获取连接
            conn=JdbcUtils.getConnection();
            /**1 创建QueryRunner对象
             *    * 该对象执行sql语句
             */
            //QueryRunner query=new QueryRunner(JdbcUtils.getDataSource());
            QueryRunner query=new QueryRunner();
                                                              
            //2 组织sql语句
            String sql="insert into emp(id,name,email) values(?,?,?)";
                                                              
            //3 设置sql语句需要的参数
            Object[] params={7,"yxkong","fishingsky@qq.com"};               
            //4 执行
            query.update(conn,sql, params);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            /**关闭资源
             *  DbUtils.close(conn);
             *     该方法关闭连接 抛出异常
             *  DbUtils.closeQuietly(conn);
             *     捕获了异常
             */
            DbUtils.closeQuietly(conn);
        }
    }
@Test
    public void update(){
        Connection conn=null;
        try {
            //获取连接
            conn=JdbcUtils.getConnection();
            /**1 创建QueryRunner对象
             *   * 该对象执行sql语句
             */
            //QueryRunner query=new QueryRunner(JdbcUtils.getDataSource());
            QueryRunner query=new QueryRunner();
                                                           
            //2 组织sql语句
            String sql="update  emp set name=?,email=?  where id=?";
                                                           
            //3 设置sql语句需要的参数
            Object[] params={"鱼翔空","zhaozhengkfu@163.com",5};               
            //4 执行insert update delete
            query.update(conn,sql, params);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            /**关闭资源
             *  DbUtils.close(conn);
             *    * 该方法关闭连接 抛出异常
             *  DbUtils.closeQuietly(conn);
             *    * 捕获了异常
             */
            DbUtils.closeQuietly(conn);
        }
    }
    @Test
    public void delete(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
            QueryRunner query=new QueryRunner();
            String sql="delete from emp where id=?";
            Object[] params={1};            
            query.update(conn,sql, params);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }

查询案例

一)查询所有的结果通过ResultSetHandler转成bean的集合

@Test
    public void findAllObject1(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
            QueryRunner query=new QueryRunner();
            String sql="select id,name,email from emp";
            /** query方法执行对数据库的select操作
             *    * query(conn, sql, new MyResultSetHandler())
             *       * 从上面的测试得到结果如下:
             *       * query方法的返回值就是ResultSetHandler接口实现类的handle(ResultSet rs)方法的返回值 
             */
            Object obj=query.query(conn, sql, new MyResultSetHandler());
            List<Emp> list=(List<Emp>)obj;
            for(Emp emp:list){
                System.out.println(emp.getId1()+" "+emp.getName()+"  "+emp.getEmail());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }
    @Test
    public void findAllObject2(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
                                  
            QueryRunner query=new QueryRunner();
            String sql="select id,name,email from emp";
            Object obj=query.query(conn, sql, new ResultSetHandler(){
                @Override
                public Object handle(ResultSet rs) throws SQLException {
                    List<Emp> list=new ArrayList<Emp>();
                    while(rs.next()){
                        Emp emp=new Emp();
                        emp.setId1(rs.getInt(1));
                        emp.setName(rs.getString(2));
                        emp.setEmail(rs.getString(3));
                        list.add(emp);
                    }
                    return list;
                }
            });
            List<Emp> list=(List<Emp>)obj;
            for(Emp emp:list){
                System.out.println(emp.getId1()+" "+emp.getName()+"  "+emp.getEmail());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }
    @Test
    public void findAllObject3(){   
    //内部类   
        ResultSetHandler resultSetHandler=new ResultSetHandler(){
            @Override
            public Object handle(ResultSet rs) throws SQLException {
                List<Emp> list=new ArrayList<Emp>();
                while(rs.next()){
                    Emp emp=new Emp();
                    emp.setId1(rs.getInt(1));
                    emp.setName(rs.getString(2));
                    emp.setEmail(rs.getString(3));
                    list.add(emp);
                }
                return list;
            }
        };  
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
                                  
            QueryRunner query=new QueryRunner();
            String sql="select id,name,email from emp";
            Object obj=query.query(conn, sql,resultSetHandler);
            List<Emp> list=(List<Emp>)obj;
            for(Emp emp:list){
                System.out.println(emp.getId1()+" "+emp.getName()+"  "+emp.getEmail());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }

MyResultSetHandler.java类内容

public class MyResultSetHandler  implements ResultSetHandler{
    public Object handle(ResultSet rs) throws SQLException {
        List<Emp> list=new ArrayList<Emp>();
        while(rs.next()){
            Emp emp=new Emp();
            emp.setId1(rs.getInt(1));
            emp.setName(rs.getString(2));
            emp.setEmail(rs.getString(3));
            list.add(emp);
        }
        return list;
    }
}

二)通过BeanListHandler自动转成集合

@Test
    public void findAllObjectByBeanListHandler(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
            QueryRunner query=new QueryRunner();
            String sql="select id id1,name,email from emp";
            /** BeanListHandler(Class claxx)
             *   * 实现了ResultSetHandler接口
             *   * 该类完成把表中的数据放置到javaBean,把javaBean放置到List中 
             *   * new BeanListHandler(Emp.class);
             *      *  该类构造方法的参数Emp.class,表示要把表中的记录封装到哪个javaBean中  
             *   * 要求:
             *     * 使用 BeanListHandler类时,javaBean中的属性必须和表中的字段名要一致,不区分大小写
             *     * 底层代码在查找是,就是通过表中的字段和javaBean的属性的名称一致对应  
             */
            Object obj=query.query(conn, sql,new BeanListHandler(Emp.class));
                                    
            List<Emp> list=(List<Emp>)obj;
            for(Emp emp:list){
                System.out.println(emp.getId1()+" "+emp.getName()+"  "+emp.getEmail());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }

三)通过BeanHandler查询一个对象,并自动封装到bean中

@Test
    public void findObjectByBeanHandler(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
            QueryRunner query=new QueryRunner();
            String sql="select id id1,name,email from emp where id=1";
            /**
             * BeanHandler(Class claxx)
             *   * 实现了ResultSetHandler接口
             *   * 该类完成把表中的数据放置到结果集中第一行记录放置到javaBean, 
             *   * new BeanHandler(Emp.class);
             *      *  该类构造方法的参数Emp.class,表示要把表中的记录封装到哪个javaBean中   
             *   * 要求:
             *     * 使用 BeanHandler类时,javaBean中的属性必须和表中的字段名要一致,不区分大小写
             *     * 底层代码在查找是,就是通过表中的字段和javaBean的属性的名称一致对应  
             */
            Object obj=query.query(conn, sql,new BeanHandler(Emp.class));
            Emp emp=(Emp)obj;
            if(emp!=null){
               System.out.println(emp.getId1()+" "+emp.getName()+"  "+emp.getEmail());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }

四)带条件的查询

@Test
    public void findAllObjectByBeanListHandlerCondition(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
            QueryRunner query=new QueryRunner();
            String sql="select id id1,name,email from emp where name like ? and email like ? ";
            //设置?需要的值
            Object[] params={"%yxk%","%163%"};
            /**
             * BeanListHandler(Class claxx)
             *   * 实现了ResultSetHandler接口
             *   * 该类完成把表中的数据放置到javaBean,把javaBean放置到List中 
             *   * new BeanListHandler(Emp.class);
             *      *  该类构造方法的参数Emp.class,表示要把表中的记录封装到哪个javaBean中
             *      
             *   * 要求:
             *     * 使用 BeanListHandler类时,javaBean中的属性必须和表中的字段名要一致,不区分大小写
             *     * 底层代码在查找是,就是通过表中的字段和javaBean的属性的名称一致对应  
             */
            Object obj=query.query(conn, sql,new BeanListHandler(Emp.class),params);
            List<Emp> list=(List<Emp>)obj;
            for(Emp emp:list){
                System.out.println(emp.getId1()+" "+emp.getName()+"  "+emp.getEmail());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }

五) 统计查询

@Test
    public void findCount(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
            QueryRunner query=new QueryRunner();
            String sql="SELECT COUNT(1) FROM emp ";
            /**
             * ScalarHandler:
             *   * 获取单行结果表中指定列的值,放置到一个对象中
             *   new ScalarHandler(columnIndex) 参数时列的索引
             */
            Object obj=query.query(conn, sql,new ScalarHandler(0));
            System.out.println("总数  "+obj);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }

六)单值查询

@Test
    public void findObject(){
        Connection conn=null;
        try {
            conn=JdbcUtils.getConnection();
            QueryRunner query=new QueryRunner();
            String sql="SELECT  id id1,NAME,email FROM emp where id=1";
            /* ScalarHandler:
             *   * 获取单行结果表中指定列的值,放置到一个对象中
             *   new ScalarHandler(columnIndex) 参数时列的索引
             */
            Object obj=query.query(conn, sql,new ScalarHandler(2));
            System.out.println("obj  "+obj);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DbUtils.closeQuietly(conn);
        }
    }

yxkong

这个人很懒,什么都没留下

文章评论