Springboot集成MongoDB,集合下划线和Java实体类小驼峰字段转换

一、需求

最近写项目,需要集成MongoDB,在想有没有类似mybatis那样,可以通过反射来解决集合下划线字段,转换成Java小驼峰字段返回。我用的Springboot版本是3.4.1,引入了spring-boot-starter-data-mongodb的pom,发现spring-data-mongodb版本是4.4.1,这个版本比较新。在网上找了好多资料,都有新老版本不兼容问题,各种尝试都不行,经过不断尝试,终于找到了解决方案。

二、引入 MongoDB 依赖

<dependencies>
   <!-- Spring Boot Starter Web -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   
   <!-- Spring Boot Starter Data MongoDB -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-mongodb</artifactId>
   </dependency>
   
   <!-- Lombok (可选,用于简化实体类) -->
   <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <optional>true</optional>
   </dependency>
   
   <!-- Spring Boot Starter Test -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
   </dependency>
</dependencies>

三. 配置 MongoDB 连接信息

spring:
  data:
    mongodb:
      uri: mongodb://user:password@localhost:27018/db?authSource=admin
      connection-timeout: 30000       # 连接超时时间(毫秒)
      read-timeout: 10000             # 读取超时时间(毫秒)
      # 连接池配置
      pool:
        max-size: 10                  # 最大连接数
        min-size: 2                   # 最小空闲连接数
        max-wait-time: 10000          # 获取连接的最大等待时间(毫秒)
        max-connection-idle-time: 60000  # 连接的最大空闲时间(毫秒)
        max-connection-life-time: 120000 # 连接的最大生存时间(毫秒)

四. 解决字段名转换问题(下划线与小驼峰)

1、方式一:全局配置

MongoDB 中通常使用下划线命名法,而 Java 中常用小驼峰命名法,我们可以通过配置实现自动转换。
创建一个全局配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mapping.model.SnakeCaseFieldNamingStrategy;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

@Configuration
public class MongoDBConfig {

    @Bean
    public MongoMappingContext mongoMappingContext() {
        MongoMappingContext context = new MongoMappingContext();
        // 4.4.1版本中使用具体的实现类SnakeCaseFieldNamingStrategy
        context.setFieldNamingStrategy(new SnakeCaseFieldNamingStrategy());
        return context;
    }
}

2、方式二:局部配置

在Java实体类字段上添加@Field注解


@Field("custom_email") // 强制指定字段名为custom_email
private String emailAddr;

注意:@Field优先级高于全局配置

五. 使用示例

1、创建一个实体类


import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@Document(collection = "user")
public class User {
    private String id;
    private String userName;  // 应转换为 user_name
    private String phoneNumber;  // 应转换为 phone_number
    private Integer userAge;  // 应转换为 user_age
}

2、测试


import com.example.entity.User;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class UserController {

    @Resource
    private MongoTemplate mongoTemplate; // Spring自动注入的MongoDB操作模板

    @GetMapping("/saveUser")
    public String saveUser() {
        User user = new User();
        user.setUserName("testUser");
        user.setUserAge(25);
        user.setEmailAddr("test@example.com");
        
        // 保存到MongoDB
        mongoTemplate.save(user);
        return "保存成功,ID:" + user.getId();
    }
}

3、查看结果

A、调用 /saveUser 接口后,在 MongoDB 中查询 user 集合,会发现字段名已自动转换为下划线格式:


{
  "_id": "650b3a7f8d1e8c6d2f7a1b2c",
  "user_name": "testUser",
  "user_age": 25,
  "email_addr": "test@example.com"
}

B、如果是查询,返回结构:


{
  "_id": "650b3a7f8d1e8c6d2f7a1b2c",
  "userName": "testUser",
  "userAge": 25,
  "emailAddr": "test@example.com"
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值