在做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来说,要损耗不少性能。
多一句:看来代码不能为了漂亮而写,而是为了效率和性能考虑才下笔。