spring jdbc是如何实现驼峰和下划线的自动映射的
2018-07-10 14:42
633 查看
今天在看写代码的时候突然发现,在类和数据库字段之间没有做过任何的映射关系,但是数据会自动的映射好
以下是spring代码的具体实现直接贴代码
讲述映射实现的过程
关注下BeanPropertyRowMapper这个类
这段代码是实现映射的地方
这个方法是把java类中的驼峰转化成数据库的下划线的方法
这段代码是检测当前字段是否需要处理驼峰命名,如果是需要转化的则需要重新赋值,key是数据库的对应字段名
这个方法中的PD是通过数据库的column获取的,正好可以跟上面讲述的转化赋值对应,然后这个从mappedFields中获取到的PD中的name就是该数据库字段对应的javaBean中的值
至此spring的默认规则的映射实现已经讲述完了
附链接
使用Spring的NamedParameterJdbcTemplate完成DAO操作
(这个是NamedParameterJdbcTemplate的一个操作讲解)
http://zmx.iteye.com/blog/373736
以下是spring代码的具体实现直接贴代码
讲述映射实现的过程
关注下BeanPropertyRowMapper这个类
protected void initialize(Class<T> mappedClass) { this.mappedClass = mappedClass; this.mappedFields = new HashMap<String, PropertyDescriptor>(); this.mappedProperties = new HashSet<String>(); PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass); for (PropertyDescriptor pd : pds) { if (pd.getWriteMethod() != null) { this.mappedFields.put(pd.getName().toLowerCase(), pd); String underscoredName = underscoreName(pd.getName()); if (!pd.getName().toLowerCase().equals(underscoredName)) { this.mappedFields.put(underscoredName, pd); } this.mappedProperties.add(pd.getName()); } } }
这段代码是实现映射的地方
String underscoredName = underscoreName(pd.getName());
这个方法是把java类中的驼峰转化成数据库的下划线的方法
if (!pd.getName().toLowerCase().equals(underscoredName)) { this.mappedFields.put(underscoredName, pd); }
这段代码是检测当前字段是否需要处理驼峰命名,如果是需要转化的则需要重新赋值,key是数据库的对应字段名
public T mapRow(ResultSet rs, int rowNumber) throws SQLException { Assert.state(this.mappedClass != null, "Mapped class was not specified"); T mappedObject = BeanUtils.instantiate(this.mappedClass); BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(mappedObject); initBeanWrapper(bw); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); Set<String> populatedProperties = (isCheckFullyPopulated() ? new HashSet<String>() : null); for (int index = 1; index <= columnCount; index++) { String column = JdbcUtils.lookupColumnName(rsmd, index); PropertyDescriptor pd = this.mappedFields.get(column.replaceAll(" ", "").toLowerCase()); if (pd != null) { try { Object value = getColumnValue(rs, index, pd); if (logger.isDebugEnabled() && rowNumber == 0) { logger.debug("Mapping column '" + column + "' to property '" + pd.getName() + "' of type " + pd.getPropertyType()); } try { bw.setPropertyValue(pd.getName(), value); } catch (TypeMismatchException e) { if (value == null && primitivesDefaultedForNullValue) { logger.debug("Intercepted TypeMismatchException for row " + rowNumber + " and column '" + column + "' with value " + value + " when setting property '" + pd.getName() + "' of type " + pd.getPropertyType() + " on object: " + mappedObject); } else { throw e; } } if (populatedProperties != null) { populatedProperties.add(pd.getName()); } } catch (NotWritablePropertyException ex) { throw new DataRetrievalFailureException( "Unable to map column " + column + " to property " + pd.getName(), ex); } } } if (populatedProperties != null && !populatedProperties.equals(this.mappedProperties)) { throw new InvalidDataAccessApiUsageException("Given ResultSet does not contain all fields " + "necessary to populate object of class [" + this.mappedClass + "]: " + this.mappedProperties); } return mappedObject; }
这个方法中的PD是通过数据库的column获取的,正好可以跟上面讲述的转化赋值对应,然后这个从mappedFields中获取到的PD中的name就是该数据库字段对应的javaBean中的值
至此spring的默认规则的映射实现已经讲述完了
附链接
使用Spring的NamedParameterJdbcTemplate完成DAO操作
(这个是NamedParameterJdbcTemplate的一个操作讲解)
http://zmx.iteye.com/blog/373736
相关文章推荐
- spring jdbc是如何实现驼峰和下划线的自动映射的
- 如何在XenDesktop没有工具栏情况下实现U盘自动映射为可移动磁盘
- spring-boot 是如何实现自动配置的
- Spring如何实现自动依赖注入-------autowire
- 在微服务领域Spring Boot自动伸缩如何实现
- SPRING BOOT是如何实现自动初始化的?
- JDBC如何实现Mysql自动重连的机制
- Spring如何实现自动依赖注入-------autowire
- Spring如何实现自动依赖注入-------autowire
- 解决springdatajpa 在解析实体类的Cloumn的时候驼峰自动转为下划线问题
- 如何在XenDesktop没有工具栏情况下实现U盘自动映射为可移动磁盘
- Spring2.5 BeanPropertyRowMapper ResultSet和实体类的字段进行实现自动映射
- JDBC如何实现Mysql自动重连的机制
- Spring Boot 使用Oracle集成Mybatis,驼峰映射(下划线)问题
- Spring如何实现自动依赖注入-------autowire
- Spring如何实现自动依赖注入-------autowire
- 如何在DataWindow中实现列的自动折行
- 如何实现ASPX页面等待5秒,自动跳转到另一个页面INDEX。ASPX
- BNF范式 如何用C++实现自动推导
- 如何实现Linux操作系统的自动登录