DbUtils:JDBC实用组件实例

这一页提供了一些展示如何使用DbUtils的示例。

基本用法

DbUtils是一个非常小的类库,因此浏览完所有类的javadoc不会花费很长时间。DbUtils的核心类/接口是QueryRunnerResultSetHandler。你不需要知道其它DbUtils类就可以使用这一类库。下面的例子展示了这些类是如何一起使用的。

  1. // Create a ResultSetHandler implementation to convert the
  2. // first row into an Object[].
  3. // 创建一个ResultSetHandler 实现,以把第一行转换成一个Object[]
  4. ResultSetHandler<Object[]> h = new ResultSetHandler<Object[]>() {
  5. public Object[] handle(ResultSet rs) throws SQLException {
  6. if (!rs.next()) {
  7. return null;
  8. }
  9.  
  10. ResultSetMetaData meta = rs.getMetaData();
  11. int cols = meta.getColumnCount();
  12. Object[] result = new Object[cols];
  13.  
  14. for (int i = 0; i < cols; i++) {
  15. result[i] = rs.getObject(i + 1);
  16. }
  17.  
  18. return result;
  19. }
  20. };
  21.  
  22. // Create a QueryRunner that will use connections from
  23. // the given DataSource
  24. // 创建一个QueryRunner,它会使用所给DataSource的连接
  25. QueryRunner run = new QueryRunner(dataSource);
  26.  
  27. // Execute the query and get the results back from the handler
  28. // 执行查询并从handler获取结果
  29. Object[] result = run.query(
  30. "SELECT * FROM Person WHERE name=?", h, "John Doe");

  

  1.  

你也可以通过 java.sql.Connection 对象来代替 DataSource来执行先前的操作。注意,在这个例子中,你应该负责关闭Connection 。

  1.  
  1. ResultSetHandler<Object[]> h = ... // Define a handler the same as above example
  2. // 定义一个和上面例子一样的handler
  3.  
  4. // No DataSource so we must handle Connections manually
  5. // 没有DataSource,所以我们必须手动处理Connections
  6. QueryRunner run = new QueryRunner();
  7.  
  8. Connection conn = ... // open a connection // 打开一个连接
  9. try{
  10. Object[] result = run.query(conn, "SELECT * FROM Person WHERE name=?", h, "John Doe");
  11. // do something with the result
  12. // 用result做些什么吧~
  13. } finally {
  14. // Use this helper method so we don't have to check for null
  15. // 使用DbUtils的方法,所以我们不需要检查是否为null
  16. DbUtils.close(conn);
  17. }

  

你不仅可以从数据库获取数据,你也可以插入或者更新数据。下面的例子将首先插入一个person到数据库,并且之后改变person的height属性。

  1. QueryRunner run = new QueryRunner( dataSource );
  2. try
  3. {
  4. // Execute the SQL update statement and return the number of
  5. // inserts that were made
  6. // 执行SQL更新语句,并返回插入的数量???
  7. int inserts = run.update( "INSERT INTO Person (name,height) VALUES (?,?)", "John Doe", 1.82 );
  8. // The line before uses varargs and autoboxing to simplify the code
  9. // 上一行使用可变参数和自动装箱以简化代码
  10.  
  11. // Now it's time to rise to the occation...
  12. // 现在是时候进入正题了
  13. int updates = run.update( "UPDATE Person SET height=? WHERE name=?", 2.05, "John Doe" );
  14. // So does the line above
  15. // 正如上一行所做
  16. }
  17. catch(SQLException sqle) {
  18. // Handle it
  19. // 处理它
  20. }

  

对于长时间运行的调用,你可以使用 AsyncQueryRunner异步执行调用。 AsyncQueryRunner 类和 QueryRunner 类调用具有相同的方法;然而,这些方法返回一个Callable.

  1. ExecutorCompletionService<Integer> executor = new ExecutorCompletionService<Integer>( Executors.newCachedThreadPool() );
  2. AsyncQueryRunner asyncRun = new AsyncQueryRunner( dataSource );
  3.  
  4. try
  5. {
  6. // Create a Callable for the update call
  7. // 为update调用创建一个Callable对象
  8. Callable<Integer> callable = asyncRun.update( "UPDATE Person SET height=? WHERE name=?", 2.05, "John Doe" );
  9. // Submit the Callable to the executor
  10. // 向executor提交Callable对象
  11. executor.submit( callable );
  12. } catch(SQLException sqle) {
  13. // Handle it
  14. // 处理它
  15. }
  16.  
  17. // Sometime later (or in another thread)
  18. // 稍后(或在另一个线程之中)
  19. try
  20. {
  21. // Get the result of the update
  22. // 获取update的结果
  23. Integer updates = executor.take().get();
  24. } catch(InterruptedException ie) {
  25. // Handle it
  26. // 处理异常
  27. }

  

ResultSetHandler的实现

在上面的例子中,我们实现了 ResultSetHandler 接口以把 ResultSet 第一行数据转换成一个Object[]。这是一个相当通用的实现,它可以在很多项目中重用。为了认识到这一点,DbUtils在org.apache.commons.dbutils.handlers包中提供了一系列 ResultSetHandler 实现,这些实现可以执行通常转换成array,maps,和JavaBean。There is a version of each implementation that converts just the first row and another that converts all rows in the ResultSet.下面是每一个实现的一个版本,这些都只是把第一行转换了,以及转换了在 ResultSet中的所有行。

我们将以一个例子开始,使用 BeanHandler 从 ResultSet 获取一行并把它转换成一个JavaBean。

  1. QueryRunner run = new QueryRunner(dataSource);
  2.  
  3. // Use the BeanHandler implementation to convert the first
  4. // ResultSet row into a Person JavaBean.
  5. // 使用BeanHandler实现以把ResultSet中第一行转换成一个Person JavaBean
  6. ResultSetHandler<Person> h = new BeanHandler<Person>(Person.class);
  7.  
  8. // Execute the SQL statement with one replacement parameter and
  9. // return the results in a new Person object generated by the BeanHandler.
  10. // 执行有一个替代参数的SQL语句,并把返回结果存入由BeanHandler生成的Person对象
  11. Person p = run.query("SELECT * FROM Person WHERE name=?", h, "John Doe");

  

现在我们将使用BeanListHandler从 ResultSet获取所有行,并以JavaBean List 的形式返回。

  1. QueryRunner run = new QueryRunner(dataSource);
  2.  
  3. // Use the BeanHandler implementation to convert the first
  4. // ResultSet row into a Person JavaBean.
  5. // 使用BeanListHandler实现以把所有的结果集行转换成Person JavaBean列表
  6. ResultSetHandler<List<Person>> h = new BeanListHandler<Person>(Person.class);
  7.  
  8. // Execute the SQL statement and return the results in a List of
  9. // Person objects generated by the BeanListHandler.
  10. // 执行SQL语句并返回由BeanListHandler生成的Person对象列表
  11. List<Person> persons = run.query("SELECT * FROM Person", h);

  

自定义RowProcessor

每一个所提供的ResultSetHandler 实现接收一个RowProcessor 来做真实的行到对象的转换。通过默认处理器使用BasicRowProcessor 实现,但是你可以实现一个自定义的版本来插入。可能最通用的自定义是去实现toBean() 方法来处理自定义数据库数据类型问题。

自定义BeanProecssor

BasicRowProcessor 使用一个BeanProcessor 来把 ResultSet 列转成JavaBean 属性. 你可以子类化并覆盖处理流程来指定你的应用程序的数据类型映射。所提供的实现把数据类型转换委托给JDBC驱动。

BeanProcessor 把列映射成为bean属性,如在BeanProcessor.toBean() Java文档中所述。 列名必须匹配bean的属性名,且区分大小写。例如,通过调用 setFirstName() 方法,firstname 类可以存储在bean中。然而,很多数据库列明包含或者不能使用或者在Java方法名中不常用的字符。你可以通过以下两种方法之一以把bean属性映射到这些列中。

  1. 把SQL中的列名别名化以使它们和Java属性名匹配: select social_sec# as socialSecurityNumber from person
  2. 子类化BeanProcessor,并覆盖方法mapColumnsToProperties() 来删除违规字符。

原文

  原文传送门

DbUtils: JDBC Utility Component Examples翻译的更多相关文章

  1. DbUtils: JDBC Utility Component Examples

    DbUtils: JDBC Utility Component Examples \JDBCCollector\jdbc\src\main\java\com\ai\toptea\collection\ ...

  2. Apache DbUtils - JDBC轻量级封装的工具包

    前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看.大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的例如大家常用的 ...

  3. DbUtils使用例子

    DbUtils: JDBC Utility Component Examples This page provides examples that show how DbUtils may be us ...

  4. jdbc ---- DBUTilDao 类

    1, 列用工具包  阿里的 DbUtils: JDBC Utility Component Examples 再次封装成通用的 update, query package com.ljs.dao; i ...

  5. 【JavaWeb】DbUtils入门之QueryRunner

    DbUtils简介 根据官网的介绍,DbUtils是一种 JDBC Utility Component (翻译过来大概就是:JDBC实用部件),故名思意,和数据库操作有关 官网上的简介也称之为 JDB ...

  6. JDBC + MySQL 示例

    jdbc mysql connection 教程 翻译自:JDBC MySQL Connection Tutorial Java Database Connectivity (JDBC) 是一个基于J ...

  7. JDBC 基础知识总结

    1.  何谓JDBC  --- Java Database Connectivity. 由Sun 公司提供的访问数据库的一组java类和接口,用来对数据库进行链接.发送SQL语句.处理返回结果,为开发 ...

  8. JDBC处理大数据

    1.处理大文本 package com.demo; import java.io.File; import java.io.FileNotFoundException; import java.io. ...

  9. Java 连接、操控数据库总结(JDBC)

    看到数据库连接不由得想起了大一末参加团队考核时的悲催经历~~,还记得当初傻傻地按照书本的代码打到 Eclipse 上,然后一运行就各种报错...报错后还傻傻地和书本的代码一遍又一遍地进行核对,发现无误 ...

随机推荐

  1. 从零开始的全栈工程师——underscore

    underscore 是js封装的一个js库 库和框架是有区别的 mvc框架就是backbone就是依赖这个库underscore就是定义了一个_( 下划线对象 ); 函数库的所有的方法都归属于这个对 ...

  2. cocoapods的安装和安装过程中遇到的问题

    查看当前的ruby版本,我的版本是ruby 2.0.0p648 小于2.2安装cocoapods时会遇到以下问题 $ ruby -v 查看当前ruby源,默认为 https://rubygems.or ...

  3. bootstrap模态框实现相对定位拖拽

    1.正常的拖拽是用绝对定位absolute来实现的,可是bootstrap的模态框是用relative,为了统一更改方便,就照着相对定位来实现拖拽效果. $(".modal .modal-h ...

  4. 网易回合制游戏录像批量下载(失效 不是因为代码 是因为网易官方关闭了录像网站 :P)

    最近在访问网易大话西游2的录像专区时,发现页面还是很早之前的板式,网易的编辑并没有打算重新美化的打算,不由得内心一寒,结合之前好几个回合制游戏的倒闭,让很多人回顾都没办法回顾, 而且,很多人现在也没有 ...

  5. iDempiere 开发指南 Process(iDem后台进程)及插件的开发及部署

    Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...

  6. 关于 C# 中接口的一些小结

    < 关于 C# 中“接口”的一些小结 > 对于 C# 这样的不支持多重继承的语言,很好的体现的层次性,但是有些时候多重继承的确有一些用武之地.   比如,在 Stream 类 . 图形设备 ...

  7. ASP.NET MVC Tips

    1. _ViewStart.cshtml会在调用每个页面的时候执行,我们可以在页面内设置Layout页面,也可以在这个页面写一些逻辑来根据不同的情况引用不同的Layout页面,详情请参考此处:

  8. python进程与线程介绍

    很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你 ...

  9. Android学习——ViewPager的使用(一)

    这一节介绍使用ViewPager,加载ViewPager主要有三部分,数据源.适配器和ViewPager与适配器关联.其中数据源分为View对象和Fragment对象,这一节先来介绍View对象. 数 ...

  10. table是可语义化

    为了使我们的网站更好的被搜索引擎抓取收录,更自然的获得更高的流量,网站标签的语义化就显得尤为重要.所谓标签语义化,就是指标签的含义. 为了更好的理解标签的语义化,先看下面这个例子: <table ...