一、需求
最近写项目,需要集成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"
}
965

被折叠的 条评论
为什么被折叠?



