DbUtils使用说明

来源:互联网 发布:node.js适用场景 编辑:程序博客网 时间:2024/05/16 17:14


基本用法

DbUtils是一个小巧的类库,在DbUtils中QueryRunner和ResultSetHandler是最核心的类和接口。 你不需要了解更多的其它类,下面的例子将展示怎样使用这个工具。

// 创建ResultSetHandler的实现类转换一行数据到Object[]。
ResultSetHandler<Object[]> h = new ResultSetHandler<Object[]>() {
    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;
    }
};

//通过DataSource获取的连接创建QueryRunnerQueryRunner run = new QueryRunner(dataSource);
// 执行查询并从处理器获取处理结果
Object[] result = run.query("SELECT * FROM USER WHERE NAME=?", h, "wesson");

你也可以通过使用传统的 java.sql.Connection 对象代替 DataSource。注意你需要负责关闭Connection对象。
ResultSetHandler<Object[]> h=...// 和上面例子一样定义一个处理器

// 没有DataSource对象,我们必须手工处理Connections连接

QueryRunner run=newQueryRunner();
Connection conn =...// 打开连接

try{
    Object[] result= run.query(conn,"SELECT * FROM USER WHERE NAME=?", h,"wesson");
        // 处理查询结果       
} finally{
    // 采用工具类的方法关闭连接,我们不用检查连接是否为空。
    DbUtils.close(conn); 
}

你不光能够查询数据,还能够插入和修改数据。


QueryRunner run = new QueryRunner( dataSource );
try
{
    // 执行SQL更新并返回插入数据的条数。
    int inserts = run.update( "INSERT INTO USER (NAME,PWD) VALUES (?,?)","jacky","123456");
    // 更新数据
    int updates = run.update( "UPDATE USER SET PWD=? WHERE NAME=?","654321", "jacky");
}
catch(SQLException sqle) {
    // 异常处理
}


 对于长时间调用可以使用AsyncQueryRunner进行异步方式调用。AsyncQueryRunner 类与QueryRunner类具有同样的方式,使用方式也一样,其返回一个Callable。


ExecutorCompletionService<Integer> executor =new ExecutorCompletionService<Integer>( Executors.newCachedThreadPool() );
AsyncQueryRunner asyncRun = new AsyncQueryRunner( dataSource );
try
{
    //为更新调用创建一个Callable
    Callable<Integer> callable = asyncRun.update( "UPDATE USER SET PWD=? WHERE NAME=?","654321", "jacky" );
    //提交Callable到执行者
    executor.submit( callable );
} catch(SQLException sqle) {
    //处理异常
}

//过段时间后或者在其他线程中
try
{
   //获取更新结果
   Integer updates = executor.take().get();
} catch(InterruptedException ie) {
    //处理异常
}

 

 ResultSetHandler实现

在上面的例子我们实现了ResultSetHandler接口转换第一行ResultSet为Object[],这是一种通用的使用方法。在包org.apache.commons.dbutils.handlers中提供了许多ResultSetHandler的实现类将查询结果转换成arrays, Maps, and JavaBeans。

我们开始使用BeanHandler从ResultSet获取一条数据库并转换成JavaBean。


QueryRunner run = new QueryRunner(dataSource);

//使用BeanHandler实现转换第一条数据为User JavaBean。
ResultSetHandler<User> h = new BeanHandler<User>(User.class);

// 执行SQL,返回BeanHandler生成的User对象。
User u = run.query( "SELECT * FROM USER WHERE NAME=?", h, "jacky"); 

下面我们使用BeanListHandler获取所有数据对象。


QueryRunner run = new QueryRunner(dataSource);

// 使用BeanListHandler实现转换所有数据为User JavaBeans List对象。
ResultSetHandler<List<User>> h = new BeanListHandler<User>(User.class);

// 执行SQL语句
List<User> users = run.query("SELECT * FROM User", h

自定义RowProcessor

每一个ResultSetHandler实现类接受一个RowProcessor实现真正的数据转换。默认处理器使用的BasicRowProcessor实现,但是你可以实现自己的。通用的自定义实现都是实现toBean()方法。

自定义BeanProcessor

BasicRowProcessor使用BeanProcessor转换ResultSet列到JavaBean属性。你可以继承和覆盖处理数据类型到特定的应用。

BeanProcessor在BeanProcessor.toBean()中映射列到bean的属性。 列名必须匹配bean的属性名。例如, firstname 列在bean中对应setFirstName()方法。有些数据库的字段无法映射为指定的java方法

名,你可以采取以下方式进行映射:
1.在SQL中采取别名匹配java的名字: select name_test as nameTest from user。
2.继承BeanProcessor类并覆盖mapColumnsToProperties()方法去掉不需要的字符。

原创粉丝点击