Spring JdbcTemplate实现通用的泛型dao四:通用自定义转换到JavaBean的RowMapper实现

来源:互联网 发布:淘宝类目有哪些 编辑:程序博客网 时间:2024/06/07 05:55

使用Spring JdbcTemplate查询出数据以后,默认返回的是Map,列名为key,值为value,为了方便操作自然要转换到我们的JavaBean实体对象,spring也提供了一个常规的通用操作类和方法,BeanPropertyRowMapper.newInstance(entityClazz),可以完成一般的转换,前提是表的列名和类的属性名必须一致,下划线分隔的貌似也行,没有进行测试。但前面提到我表中的列名为了防止冲突,都是以“_”开头的,并且以“_”分隔,在实际运行中发现BeanPropertyRowMapper并不能完成转换,没办法只能自己实现一个了。


同样用到了Java的反射和名称的转换,原理上和构建sql时是差不多的。要实现自定义的转换必须实现spring提供的RowMapper <T>接口,下面是代码:

  1. /**
  2. * 默认通用类型映射转换
  3. *
  4. * User: liyd
  5. * Date: 2/12/14
  6. * Time: 10:02 PM
  7. */
  8. public class DefaultRowMapper implements RowMapper<Object> {
  9. /** 转换的目标对象 */
  10. private Class<?> clazz;
  11. /** 名称处理器 */
  12. private NameHandler nameHandler;
  13. public DefaultRowMapper(Class<?> clazz, NameHandler nameHandler) {
  14. this.clazz = clazz;
  15. this.nameHandler = nameHandler;
  16. }
  17. @Override
  18. public Object mapRow(ResultSet resultSet, int i) throws SQLException {
  19. Object entity = ClassUtils.newInstance(this.clazz);
  20. BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(this.clazz);
  21. PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
  22. for (PropertyDescriptor pd : pds) {
  23. String column = nameHandler.getColumnName(pd.getName());
  24. Method writeMethod = pd.getWriteMethod();
  25. if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
  26. writeMethod.setAccessible(true);
  27. }
  28. try {
  29. writeMethod.invoke(entity, resultSet.getObject(column));
  30. } catch (Exception e) {
  31. throw new MincoderException(e);
  32. }
  33. }
  34. return entity;
  35. }
  36. }

这样就大功告成了,想不到一点点内容写出来也有这么多,可能是我总结的不好吧。

0 0