---------------Commons-DBUtils数据库开源框架-----------------------------------------------------------------------------------------------------------------------
1、Apache组织提供的一个开源 JDBC工具类库,对JDBC操作进行了简单的封装。并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。解决了两个问题:a).自动创建和释放连接资源,不再有泄漏问题。b).自动将Result转换成对象。填入不同的ResultSetHandler,可将ResultSet转换成不同的对象。使得代码更加简洁和健壮,让你将精力更多地投入到业务处理中。
2、重点类:
org.apache.commons.dbutils.QueryRunnerorg.apache.commons.dbutils.ResultSetHandlerorg.apache.commons.dbutils.DbUtils 3、QueryRunner类://简单查询使用带一个参数的构造方法QueryRunner qr = new QueryRunner(ds);//复杂查询使用两个参数的构造方法QueryRunner qr = new QueryRunner(ds,true);构造方法:new QueryRunner()new QueryRunner(DataSource ds)new QueryRunner(ds,true)常用方法:
public transient int update(String sql, Object params[]) throws SQLException根据参数执行一个更新(插入、更新或删除)操作,返回值为影响的行数。 public int update(String sql) throws SQLException用来执行一个不需要参数的更新(插入、更新或删除)操作,返回值为影响的行数。 public Object query(String sql, ResultSetHandler rsh) throws SQLException:根据传入的SQL语句仅得到一条结果 public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭,Connection不关闭。 public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源中获得连接,内部自动关闭连接. public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。4、ResultSetHandler实现类:
ScalarHandler:用户插入数据时,返回插入数据的标识字段的值。Object id = qr.insert(sql, new ScalarHandler(),"lzj","123");BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
new BeanHandler<User>(User.class)BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
new BeanListHandler<User>(User.class)MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
Map<String, Object> map=(Map<String, Object>)qr.query(sql, new MapHandler());MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
每个map的键都是结果集的第一行
List<Map<String, Object>> listMaps= qr.query(sql, new MapListHandler());ColumnListHandler:将结果集中某一列的数据存放到List中。
List<String> list = (List) qr.query(sql, new ColumnListHandler("userId"));KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
Map<Integer,Map> map = (Map) qr.query(sql, new KeyedHandler("userId"));返回值:内部的map仍旧与列名字有关
ArrayHandler:把结果集中的第一行数据转成对象数组。
Object result[] = (Object[]) qr.query(sql, new ArrayHandler());ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
List<Object[]> list = (List) qr.query(sql, new ArrayListHandler());5.事务注意:
使用QueryRunner对象的query方法包装为对象,必须具备如下条件,方可包装成功:1.实体类User和数据库user表是通过UserVo.class来映射绑定的,实体类名可以和数据库表名不一致; 2.实体类User中的属性要和user表中的字段名和字段类型必须要一致;3.实体类User必须生成标准的set/get方法。