DbUtils 技术文档

pkptzx

贡献于2011-12-21

字数:0 关键词: 持久层框架

DbUtils技术文档 杜标棋(2008-9-22) DbUtils 是一个小类库,旨在使工作的JDBC 更加容易。 JDBC的资 源善后代码是琐碎的、容易出错的工作,使用这些类可以让所有的善 后清理工作从您的代码分离,而把你真正想用 JDBC 做的事与摆在首 位:查询和更新数据。 利用 DbUtils 一些优势: 不可能存在资源未关闭。正确的 JDBC 编码并不难,但需花费大量的时间和繁琐的。这往 往导致资源未释放,很难追查。 更简洁,更清晰的持续代码。数量众多的代码被精简,剩下只有数据库中持久化数据操作。 其代码能清楚地表达你的意图,而不被资源善后清理混乱干扰。 自动填充 JavaBean 属性的 ResultSets。您不必手动复制列的值到属性实例,建议用 setter 方法。每一行的结果可以委派给一个完整的 bean 实例。 包的范围 DbUtils 的设计是:  小 - 你能够在很短的时间理解整个包。  透明- DbUtils 没有做任何神奇的幕后。您给它一个查询,它执行之,并善后之。  快速 - 使用 DbUtils 你不必创建成千上万个临时工作对象。 DbUtils 不是:  一种对象/关系映射桥梁 - 现已经有很多很好的工具了。 DbUtils 是为开发者希望直 接使用 JDBC 准备的而不是用其它的映射工具。  数据访问对象 框架 - DbUtils 可以用来建立一个 DAO 框架的。  面向对象的抽象一般的数据库对象如表,列,或主键。  任何种类的重量级框架 - 这里的目标是成为一个简单易用的 JDBC 辅助库。 DbUtils 是一个非常小的类库,因此它不需要花很长时间通过 javadocs 掌握每一个类。 DbUtils 的核心类/接口是 QueryRunner 和 ResultSetHandler,您不必了解任何 DbUtils 的其他类 怎么使用。下面的例子演示了如何将这些类一起使用。 //创建一个 ResultSetHandler 实现类转换第一行到一个 Object 数组 ResultSetHandler h = new ResultSetHandler() { public Object handle(ResultSet rs) throws SQLException { if (!rs.next()) { return null; } ResultSetMetaData meta = rs.getMetaData(); int cols = meta.getColumnCount(); Object[] result = new Object[cols]; for (int i = 0; i < cols; i++) { result[i] = rs.getObject(i + 1); } return result; } }; //从传入一个数据源得到连接创建一个 QueryRunner QueryRunner run = new QueryRunner(dataSource); //通过回调句柄执行查询把结果返回 Object[] result = (Object[]) run.query( "SELECT * FROM Person WHERE name=?", "John Doe", h); 您还可以进行查询使用 java.sql.Connection 对象,而不是数据源。请注意,您负责关闭连 接!参考例子。 ResultSetHandler h = ... // 定义一个 Handler 句柄类似上面例子 //没有任何数据源,所以我们必须处理手动连接 QueryRunner run = new QueryRunner(); Connection conn = ... // 打开一个连接 try{ Object[] result = (Object[]) run.query(conn, "SELECT * FROM Person WHERE name=?", "John Doe", h); // 对结果进行处理 } finally { //使用此辅助方法这样我们就不用检查是否为空 DbUtils.close(conn); } 上述范例中,我们实现 ResultSetHandler 接口把第一行的结果为 Object[] 。这是一个相当 通用的执行情况,可重复使用在许多项目。认识到这一点 DbUtils 提供了一套 ResultSetHandler 实施的 org.apache.commons.dbutils.handlers 封装,履行共同转变成数组,Map,和 JavaBeans 。 有一种版本的每个执行转换只是第一行,另一种转换所有行的结果。 (一) 每个执行转换只是第一行 QueryRunner run = new QueryRunner(dataSource); //使用 BeanHandler 执行转换结果的第一行为一个 JavaBean。 ResultSetHandler h = new BeanHandler(Person.class); //通过 BeanHandler 执行带一个替代参数的 SQL 语句并返回结果到一个新对象 Person Person p = (Person) run.query( "SELECT * FROM Person WHERE name=?", "John Doe", h); (二)转换所有行的结果 QueryRunner run = new QueryRunner(dataSource); ResultSetHandler h = new BeanListHandler(Person.class); List persons = (Person) run.query( "SELECT * FROM Person, h); 自定义 RowProcessor 每个实现提供 ResultSetHandler 接受 RowProcessor 处理实际行转换成对象。根据预设的处 理程序是使用 BasicRowProcessor 执行的,当然你也可以执行自定义插拔,也许最常见的定制 就是实现 toBean()方法来处理自定义数据库数据类型的问题。 自定义 BeanProcessor BasicRowProcessor 使用 BeanProcessor 转换结果列到 JavaBean 的属性里。你可以子类和覆 盖步骤来处理具体的数据类型映射到您的应用程序。实现将代理数据类型转换为 JDBC 驱动 程序类型。 BeanProcessor 映射列到 bean 属性参看 BeanProcessor.toBean()文档。列名称必须符合 bean 的属性名称 insensitively 名字。例如,firstname 列将储存在 bean 要求其 setFirstName()方法。 然而,许多数据库列名称包括字符,要么不能使用或不能使用在通常的 Java 方法名里。您可 以执行下列操作之一映射这些列到 bean 属性里: 1 、用列名的别名在 SQL 语句种匹配的 Java 名称:选择 select social_sec# as socialSecurityNumber from person 2、继承 BeanProcessor 覆盖 mapColumnsToProperties()方法来剔除违规字符。 增删改例子: public void reg(User user) { //传入数据源生成一个查询对象 QueryRunner run = new QueryRunner(dataSource); //生成参数数组 Object[] params = new Object[] { user.getUsername(), user.getPassword(), user.getRealname(), user.getBirthday(),user.getPicture() }; String sql = "insert into web_user (username,password,realname,birthday,picture) values(?,?,?,?,?)"; try {//执行 run.update(sql, params); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void delete(User user) { QueryRunner run = new QueryRunner(dataSource); Object[] params = new Object[] { user.getUsername()}; String sql = "delete from web_user where username=?"; try { run.update(sql, params); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void modifyPassword(String username, String newpassword) { QueryRunner run = new QueryRunner(dataSource); Object[] params = new Object[] {newpassword,username}; String sql = "update web_user set password=? where username=?"; try { run.update(sql, params); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 链接: http://commons.apache.org/dbutils/ 附: DBUtils 包括 3 个包: org.apache.commons.dbutils org.apache.commons.dbutils.handlers org.apache.commons.dbutils.wrappers org.apache.commons.dbutils DbUtils 关闭链接等操作 QueryRunner 进行查询的操作 org.apache.commons.dbutils.handlers ArrayHandler :将 ResultSet 中第一行的数据转化成对象数组 ArrayListHandler 将 ResultSet 中所有的数据转化成 List,List 中存放的是 Object[] BeanHandler :将 ResultSet 中第一行的数据转化成类对象 BeanListHandler :将 ResultSet 中所有的数据转化成 List,List 中存放的是类对象 ColumnListHandler :将 ResultSet 中某一列的数据存成 List,List 中存放的是 Object 对象 KeyedHandler :将 ResultSet 中存成映射,key 为某一列对应为 Map。Map 中存放的是数据 MapHandler :将 ResultSet 中第一行的数据存成 Map 映射 MapListHandler :将 ResultSet 中所有的数据存成 List。List 中存放的是 Map ScalarHandler :将 ResultSet 中一条记录的其中某一列的数据存成 Object org.apache.commons.dbutils.wrappers SqlNullCheckedResultSet :对 ResultSet 进行操作,改版里面的值 StringTrimmedResultSet :去除 ResultSet 中中字段的左右空格。Trim() 总结一句话 DBUtils 封装了对 JDBC 的操作,简化了 JDBC 操作, 可以少写代码。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档

相关文档