简介
在以前的文章中,介绍了在 Java 中如何原生的使用 MongoDB,本篇将介绍如果使用 Spring 封装好的 MongoDB Data
Maven 依赖
我们使用一个简单的 Web 服务作为示例,完整的 Maven 配置如下:
我们导入 MongoDB 核心:spring-boot-starter-data-mongodb
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.self.growth</groupId> <artifactId>task</artifactId> <version>0.0.1-SNAPSHOT</version> <name>task</name> <description>task</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project>
复制代码
实体/模型和 Repository
如同使用 mybatis 一样,我们也需要创建一个映射到数据库中数据模型的类
如下所示,我们就使用注解标注了 ID 字段,在 MongoDB 中,自生成的 ID 是 String 类型的
public class TaskConfig {
@Id private String id; private String name; private String description; private LabelEnum label; private TaskCycleEnum cycleType; private TaskLearnTypeEnum learnType; private String group; private TaskTypeEnum taskTypeEnum; private Boolean isComplete; private Date completeDate;}
复制代码
然后创建一个 Mapper 之类的 Repository 层的接口类,基本功能和 Mapper 差不多
和 Mybatis plus 很像,其中默认封装了很多的基础查询,一些特殊的查询,在接口中自行添加即可
public interface TaskRepository extends MongoRepository<TaskConfig, String> {
TaskConfig findByGroupAndName(final String group, final String name);}
复制代码
如果所示,我们添加了一个方法,是应该数据的 group 和 name 字段进行查看的查询函数,并且只返回一条数据
Controller 层与 Service 层
我们定义一个简单的 Controller 层如下:一个简单的更新接口和查询列表接口
@RestController@RequestMapping("/task")public class TaskController {
private final TaskService taskService;
public TaskController(final TaskService taskService) { this.taskService = taskService; }
@PostMapping("/update") public void update(@RequestBody TaskConfig config) { taskService.update(config); }
@GetMapping("/list") public List<TaskConfig> list() { return taskService.list(); }}
复制代码
具体的 Service 实现如下:
@Servicepublic record TaskService(TaskRepository taskRepository) {
public void update(final TaskConfig config) { final TaskConfig task = taskRepository.findByGroupAndName(config.getGroup(), config.getName()); if (task == null) { taskRepository.insert(config); return; } taskRepository.delete(task); taskRepository.insert(config); }
public List<TaskConfig> list() { return taskRepository.findAll(); }}
复制代码
目前尝鲜使用的是 Java17,体验了一下一些新特性,在上面我们看到在类声明中使用了 record 关键字,直接在类声明中就传入构造函数所需要的参数
感觉目前编程语言的发展趋势是越来越便捷了,目前感觉还不错
在更新接口中,看到我们先去查看数据库中有没有这条数据,没有则插入,有则先删除,再插入
而列表接口,直接一个 findAll 返回所有数据
总结
我们可以看到很多的查询都是内置的,而且我们目前也没有变成任何的复杂的 Sql
spring 提供的这些还是一贯的有助于提升开发效率,在声明特有的语句时,之前用过原生的 MongoDB 查询,就能大致的知道如果使用
评论