---------------Commons-DBUtils数据库开源框架-----------------------------------------------------------------------------------------------------------------------
1、Apache组织提供的一个开源 JDBC工具类库,对JDBC操作进行了简单的封装。
并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
解决了两个问题:
a).自动创建和释放连接资源,不再有泄漏问题。
b).自动将Result转换成对象。填入不同的ResultSetHandler,可将ResultSet转换成不同的对象。使得代码更加简洁和健壮,让你将精力更多地投入到业务处理中。
2、重点类:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
org.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.class)
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
new BeanListHandler(User.class)
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
Map map=(Map)qr.query(sql, new MapHandler());
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
每个map的键都是结果集的第一行
List> listMaps= qr.query(sql, new MapListHandler());
ColumnListHandler:将结果集中某一列的数据存放到List中。
List list = (List) qr.query(sql, new ColumnListHandler("userId"));
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
Map map = (Map) qr.query(sql, new KeyedHandler("userId"));
返回值:内部的map仍旧与列名字有关
ArrayHandler:把结果集中的第一行数据转成对象数组。
Object result[] = (Object[]) qr.query(sql, new ArrayHandler());
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
List list = (List) qr.query(sql, new ArrayListHandler());
5.事务
注意:
使用QueryRunner对象的query方法包装为对象,必须具备如下条件,方可包装成功:
1.实体类User和数据库user表是通过UserVo.class来映射绑定的,实体类名可以和数据库表名不一致;
2.实体类User中的属性要和user表中的字段名和字段类型必须要一致;
3.实体类User必须生成标准的set/get方法。