---------------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方法。