Spring简单持久层ORM实现之dbutils

 

在做Spring MVC项目的时候,持久层并没有使用Spring JPA和Hibernate结合,而是使用了Spring原生的JdbcTemplate。JdbcTemplate效率比较高,直接使用原生的jdbc操作,返回的数据是List<Map>的形式。

现在我想寻找一种简单的ORM映射,把数据库查询到的数据转换为JavaBean,因为有时候我们操作JavaBean往往比操作Map要方便和简洁。

我找到了Apache Commons项目下的一个工具:DbUtils。这个工具使用起来非常简单,原理是利用Java反射技术来提供ORM映射服务的。相对Hibernate来说,他更加简洁和快速。

 

最好先去现在一个这个工具包:http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi

本来以为它会依赖于BeanUtils包,可是它并没有。

 

下面是两个通用的方法,适用于在Spring中使用:

    /**
     * @描述 根据sql查询集合
     * @时间 2013-1-28 上午10:24:41
     * @author ... Email:li15038043160@163.com
     * @param cl
     *            限定类型
     * @param sql
     *            查询语句
     * @return 集合
     * @例子 查询的字段,必须与实体类的字段名相同。 "select s.name,s.age,s.update_time updateTime from student s"
     *     Student实体类的字段是name,age,updateTime.这个查询利用反射原理,所以查询名要和实体类字段对应起来才行
     */
    public <T> List<T> query(Class<T> cl, String sql) {
        List<T> list = null;
        qr = new QueryRunner(jdbcTemplate.getDataSource());
        try {
            list = qr.query(sql, new BeanListHandler<T>(cl));

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * @描述 根据sql查询一条数据
     * @时间 2013-1-28 上午10:28:38
     * @author ... Email:li15038043160@163.com
     * @param cl
     *            限定类型
     * @param sql
     *            查询语句
     * @return 一条数据
     * @例子 需要注意的是,本查询利用Java反射。所以sql中的查询字段要和实体类字段名一致
     */
    public <T> T find(Class<T> cl, String sql) {
        try {
            qr = new QueryRunner(jdbcTemplate.getDataSource());
            return (T) qr.query(sql, new BeanHandler<T>(cl));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

 

一个使用的例子是:

        List<Category> listCategories = commonDao.query(Category.class,
                "SELECT id,name,position FROM `category` c WHERE c.`class_id`=" + classId
                        + " ORDER BY c.`position` DESC");

 

我并没有详细介绍DbUtils的API,如果上面的通用方法你看起来有点不知所云,可以自行查找关于DbUtils的详细介绍。

上面的两个方法只能用作查询使用,删除和更新,都要使用JdbcTemplate来操作。

 

使用经验:

  刚开始Spring MVC项目的时候,由于习惯了使用Hibernate等ORM框架,所以潜意识中要把数据库数据转换为JavaBean。但是后来发现,如果就查询来说,使用List<Map>的数据也不是很麻烦。因为前台页面在解析的时候,读取Map中对应字段和读取JavaBean对应字段速度是一样的,操作简便性也是一样的。

  而非要使用DbUtils来转换数据,则相对于JdbcTemplate来说,要损耗不少性能。

  

多一句:看来代码不能为了漂亮而写,而是为了效率和性能考虑才下笔。

 

 

 

 

 

posted @ 2013-04-28 10:07  轩辕李  阅读(2680)  评论(0编辑  收藏  举报