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); } }
文章评论