注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

Apache Commons DbUtils 使用教程 | Apache Commons DbUtils Tutorial  

2014-06-10 23:06:12|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

用JDBC编程时,需要关注和处理的内容非常多,而且很容易造成连接资源没有释放导致泄漏的问题。一个普通的查询操作其处理过程如下:

  1. 创建Connection。
  2. 创建Statement。
  3. 执行SQL生成ResultSet,历遍ResultSet中的所有行记录提取列数据并转换成所需的对象。
  4. 关闭ResultSet。
  5. 关闭Statement。
  6. 关闭Connection。

Apache DbUtils对JDBC操作进行了轻量地封装,解决了两个问题

  1. 自动创建和释放连接资源,不再有泄漏问题。
  2. 自动将Result转换成对象。填入不同的ResultSetHandler,可将ResultSet转换成不同的对象。

使得代码更加简洁和健壮,让你将精力更多地投入到业务处理中。

Apache DbUtils 使用教程 | Apache DbUtils Tutorial - 傲风 - 0与1构筑世界,程序员创造时代

预备

  • MySQL数据库
  • commons-dbutils-1.5.jar
  • mysql-connector-java-5.1.22-bin.jar

创建表和初始化数据

1、表结构。

CREATE TABLE `student` (
  `userId` int(11) NOT NULL,
  `userName` varchar(30) NOT NULL,
  `gender` char(1) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

2、初始化数据。

userIduserNamegenderage
1张三M20
2李四M21
3王五M22
4小明M6
5小丽F9

编写查询代码

1、将查询结果转换成POJO对象列表。

1)定义一个与表student相对应的对象Student(源代码下载)。

2)使用BeanListHandler将查询结果转换成POJO对象列表

public void queryBeanList(DataSource ds) {
    String sql = "select userId, userName, gender, age from student";

    QueryRunner run = new QueryRunner(ds);
    ResultSetHandler<List<Student>> handler = new BeanListHandler<Student>(Student.class);
    List<Student> result = null;
    try {
        result = run.query(sql, handler);
    } catch (SQLException e) {
        _logger.error("获取JDBC连接出错或执行SQL出错", e);
    }

    if (null == result) {
        return;
    }
    for (Student student : result) {
        System.out.println(student);
    }
}

执行queryBeanList方法,控制台输出如下信息:

Student [userId=1, userName=张三, gender=M, age=20]
Student [userId=2, userName=李四, gender=M, age=21]
Student [userId=3, userName=王五, gender=M, age=22]
Student [userId=4, userName=小明, gender=M, age=6]
Student [userId=5, userName=小丽, gender=F, age=9]

2、将查询结果转换成一个POJO象。

1)定义一个与表student相对应的对象Student(源代码下载)。

2)使用BeanHandler将查询结果转换成一个POJO对象

public void queryBean(DataSource ds, int userId) {
    String sql = "select userId, userName, gender, age from student where userId=?";

    QueryRunner run = new QueryRunner(ds);
    ResultSetHandler<Student> handler = new BeanHandler<Student>(Student.class);
    Student result = null;
    try {
        result = run.query(sql, handler, userId);
    } catch (SQLException e) {
        _logger.error("获取JDBC连接出错或执行SQL出错", e);
    }

    System.out.println(result);
}

执行queryBean方法,控制台输出如下信息:

Student [userId=1, userName=张三, gender=M, age=20]

3、将查询结果转换成Map对象列表。

1)使用MapListHandler将ResultSet转换成Map对象列表

public void queryMapList(DataSource ds) {
    String sql = "select userId, userName, gender, age from student";

    QueryRunner run = new QueryRunner(ds);
    ResultSetHandler<List<Map<String, Object>>> handler = new MapListHandler();
    List<Map<String, Object>> result = null;
    try {
        result = run.query(sql, handler);
    } catch (SQLException e) {
        _logger.error("获取JDBC连接出错或执行SQL出错", e);
    }

    if (null == result) {
        return;
    }
    for (Map<String, Object> map : result) {
        System.out.println(map);
    }
}

执行queryMapList方法,控制台输出如下信息:

{age=20, userId=1, gender=M, userName=张三}
{age=21, userId=2, gender=M, userName=李四}
{age=22, userId=3, gender=M, userName=王五}
{age=6, userId=4, gender=M, userName=小明}
{age=9, userId=5, gender=F, userName=小丽}

4、将查询结果转换成一个Map对象。

1)使用MapHandler将ResultSet转换成一个Map对象

public void queryMap(DataSource ds, int userId) {
    String sql = "select userId, userName, gender, age from student where userId=?";

    QueryRunner run = new QueryRunner(ds);
    ResultSetHandler<Map<String, Object>> handler = new MapHandler();
    Map<String, Object> result = null;
    try {
        result = run.query(sql, handler, userId);
    } catch (SQLException e) {
        _logger.error("获取JDBC连接出错或执行SQL出错", e);
    }

    System.out.println(result);
}

执行queryMap方法,控制台输出如下信息:

{age=22, userId=3, gender=M, userName=王五}

5、自定义ResultSetHandler。

Apache DbUtils自带的各种ResultSetHandler已经可以满足绝大部分的查询需求,如果有一些特殊的要求满足不了,可以自己实现一个

public void queryCustomHandler(DataSource ds) {
    String sql = "select userId, userName, gender, age from student";

    // 新实现一个ResultSetHandler
    ResultSetHandler<List<Student>> handler = new ResultSetHandler<List<Student>>() {
        @Override
        public List<Student> handle(ResultSet resultset)
                throws SQLException {
            List<Student> result = new ArrayList<Student>();
            while (resultset.next()) {
                Student student = new Student();
                student.setUserId(resultset.getInt("userId"));
                student.setUserName(resultset.getString("userName"));
                student.setGender(resultset.getString("gender"));
                student.setAge(resultset.getInt("age"));
                result.add(student);
            }

            return result;
        }

    };

    QueryRunner run = new QueryRunner(ds);
    List<Student> result = null;
    try {
        result = run.query(sql, handler);
    } catch (SQLException e) {
        _logger.error("获取JDBC连接出错或执行SQL出错", e);
    }

    if (null == result) {
        return;
    }
    for (Student student : result) {
        System.out.println(student);
    }
}

执行queryCustomHandler方法,控制台输出如下信息:

Student [userId=1, userName=张三, gender=M, age=20]
Student [userId=2, userName=李四, gender=M, age=21]
Student [userId=3, userName=王五, gender=M, age=22]
Student [userId=4, userName=小明, gender=M, age=6]
Student [userId=5, userName=小丽, gender=F, age=9]

附录

参考资料


<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2014年06月10日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容或者说明原作者和转载地址!

  评论这张
 
阅读(2737)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017