spring jdbc是如何实现驼峰和下划线的自动映射的

20 篇文章 0 订阅
5 篇文章 0 订阅

今天在看写代码的时候突然发现,在类和数据库字段之间没有做过任何的映射关系,但是数据会自动的映射好
以下是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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Spring Boot中,我们可以通过配置来实现参数的驼峰下划线自动转换。 首先,我们需要在application.properties或application.yml文件中添加以下配置: 1.开启驼峰转换:spring.jackson.property-naming-strategy=SNAKE_CASE 这个配置项指定了Jackson在序列化和反序列化过程中使用的命名策略。SNAKE_CASE表示使用下划线命名策略。 2.关闭驼峰转换:spring.jackson.property-naming-strategy=org.springframework.boot.autoconfigure.jackson.JacksonProperties$PropertyNamingStrategy#CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES 这个配置项指定了使用驼峰命名策略进行参数的转换。 以上配置项中的驼峰转换策略和下划线转换策略只能二选一,根据实际需要进行选择。 在实际应用中,我们可以通过在Entity类的属性上添加注解来指定参数的命名策略。例如,在属性上添加@PropertyName("user_name")注解,指定了属性在序列化和反序列化时所使用的参数名。 总之,通过在Spring Boot的配置文件中添加相应的配置项或在实体类的属性上添加注解,我们可以实现参数的驼峰下划线自动转换功能。这样的配置可以提高代码的可读性和可维护性,使得接口设计更加灵活和规范。 ### 回答2: Spring Boot提供了一种方便的方式来实现参数的驼峰下划线自动转换配置。以下是如何配置的步骤: 1. 在Spring Boot的配置文件中,添加以下配置项: ```yaml spring: jackson: property-naming-strategy: SNAKE_CASE ``` 这里使用的是Jackson库的SNAKE_CASE命名策略。SNAKE_CASE命名策略会将驼峰命名的参数自动转换为下划线命名的参数。 2. 在服务端的Controller类中,为需要进行自动转换的参数添加`@RequestParam`注解,并指定`name`属性为下划线命名的参数名称。例如: ```java @GetMapping("/user") public User getUser(@RequestParam("user_id") Long userId) { // 处理业务逻辑 } ``` 上面的例子中,`getUser`方法的参数`userId`会被自动转换为名为`user_id`的下划线命名参数。 配置完成后,Spring Boot会自动将参数的驼峰命名转换为下划线命名,以便与前端或其他系统之间进行数据传输。同时,也会将下划线命名的参数转换为驼峰命名,以便在后端进行处理。 这种配置方式可以方便地统一参数命名风格,减少手动进行命名转换的工作量。同时,也提高了系统的可读性和可维护性。 ### 回答3: 在Spring Boot中实现参数的驼峰下划线自动转换,可以通过使用`springfox`库来简化处理。首先,在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-data-rest</artifactId> <version>3.0.0</version> </dependency> ``` 然后,在配置文件中进行如下配置: ```properties spring.jackson.property-naming-strategy=SNAKE_CASE ``` 以上配置会将Java对象的属性名转换为下划线格式,如`userName`将转换为`user_name`。接下来,我们需要创建一个自定义的转换管理器,实现驼峰下划线的相互转换。 ```java @Configuration public class CustomObjectMapperConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); return objectMapper; } @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(objectMapper()); return converter; } } ``` 最后,我们需要将自定义转换管理器注册到Spring Boot的配置中。 ```java @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Autowired private MappingJackson2HttpMessageConverter converter; @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(converter); } } ``` 通过以上配置,Spring Boot将自动驼峰格式的参数转换为下划线格式的参数,从而实现参数的驼峰下划线自动转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值