MongoDB 作为一种基于分布式文档存储的数据库,所存数据即为一个文件。数据结构为键值对的方式(key-value)。本文将介绍基于 Spring Boot 2.4 集成 MongDB,实现基本的增删改查(CRUD)。
MongoDB 官方文档: https://docs.atlas.mongodb.com/getting-started
./demo-mongodb/pom.xml
<!-- mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Spring Boot 提供了官方的集成依赖,版本号与 SpringBoot 版本一致,本示例中版本为 2.4.1
./demo-mongodb/src/main/resources/application.yml
## config
server:
port: 8650
## spring config
spring:
data:
mongodb:
authentication-database: admin
username: rout
password: routSa213
database: admin
host: 172.16.140.10
port: 27017
## log
logging:
level:
org.springframework.data.mongodb.core.MongoTemplate: debug
org.springframework.data.couchbase.repository.query : debug
如需要打印MongoDB执行的SQL日志,则配置日志信息。如许对日志进行过滤,可在 logbak 的配置文件中进行配置。
./demo-mongodb/src/main/resources/logback.xml
<logger name="org.mongodb.driver.protocol.command" level="info" />如果不过滤,则控制台会频繁输出 MongoDB 的查询扫描日志。可根据情况确定是否开启日志。
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/entity/UserEntity.java
package com.ljq.demo.springboot.mongodb.model.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @Description: 用户信息
* @Author: junqiang.lu
* @Date: 2021/1/6
*/
@Data
@Document(value = "user")
@ApiModel(value = "用户信息", description = "用户信息")
public class UserEntity {
/**
* id
*/
@Id
@ApiModelProperty(value = "id", name = "id")
private String id;
/**
* 姓名
*/
@ApiModelProperty(value = "姓名", name = "name")
private String name;
/**
* 年龄
*/
@ApiModelProperty(value = "年龄", name = "age")
private Integer age;
/**
* 简介
*/
@ApiModelProperty(value = "简介", name = "introduction")
private String introduction;
}@Document 注解表明该对象为 MongoDB 的文档,其 value 属性用于定义文档的名称
@Id 注解表明该字段为主键,MongoDB在保存数据时会自动生成一条名为 _id 的值作为该条数据的唯一编码,其Java数据类型为 org.bson.types.ObjectId ,使用 @Id 注解可实现数据的自动转换
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/repository/UserRepository.java
package com.ljq.demo.springboot.mongodb.repository;
import com.ljq.demo.springboot.mongodb.model.entity.UserEntity;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
/**
* @Description: 用户数据持久层
* @Author: junqiang.lu
* @Date: 2021/1/6
*/
public interface UserRepository extends MongoRepository<UserEntity, String> {
/**
* 根据年龄查询
*
* @param age
* @return
*/
List<UserEntity> findByAge(Integer age);
}MopngoDB 的数据持久成操作和其他数据库类型的数据持久层操作代码风格一致,都是 JPA 的实现。这一点是和 Mybatis 有一定的区别。
业务接口
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/service/UserService.java
package com.ljq.demo.springboot.mongodb.service;
import com.ljq.demo.springboot.mongodb.model.entity.UserEntity;
import com.ljq.demo.springboot.mongodb.model.param.*;
import org.springframework.data.domain.Page;
/**
* 业务层接口
*
* @author junqiang.lu
* @date 2021-01-06 20:03:33
*/
public interface UserService {
/**
* 保存(单条)
*
* @param userSaveParam
* @return
*/
UserEntity save(UserSaveParam userSaveParam);
/**
* 查询详情(单条)
*
* @param userInfoParam
* @return
*/
UserEntity info(UserInfoParam userInfoParam);
/**
* 查询列表
*
* @param userListParam
* @return
*/
Page<UserEntity> list(UserListParam userListParam);
/**
* 更新(单条)
*
* @param userUpdateParam
* @return
*/
UserEntity update(UserUpdateParam userUpdateParam);
/**
* 删除(单条)
*
* @param userDeleteParam
* @return
*/
void delete(UserDeleteParam userDeleteParam);
/**
* 批量删除
*
* @param deleteBatchParam
*/
void deleteBatch(UserDeleteBatchParam deleteBatchParam);
}业务层实现类
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/service/impl/UserServiceImpl.java
package com.ljq.demo.springboot.mongodb.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.ljq.demo.springboot.mongodb.model.entity.UserEntity;
import com.ljq.demo.springboot.mongodb.model.param.*;
import com.ljq.demo.springboot.mongodb.repository.UserRepository;
import com.ljq.demo.springboot.mongodb.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* @Description: 用户业务层实现类
* @Author: junqiang.lu
* @Date: 2021/1/7
*/
@Service(value = "userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
/**
* 保存(单条)
*
* @param userSaveParam
* @return
*/
@Override
public UserEntity save(UserSaveParam userSaveParam) {
UserEntity userParam = new UserEntity();
BeanUtil.copyProperties(userSaveParam,userParam, CopyOptions.create().ignoreError().ignoreNullValue());
userParam = userRepository.save(userParam);
return userParam;
}
/**
* 查询详情(单条)
*
* @param userInfoParam
* @return
*/
@Override
public UserEntity info(UserInfoParam userInfoParam) {
Optional<UserEntity> userDBOpt = userRepository.findById(userInfoParam.getId());
return userDBOpt.get();
}
/**
* 查询列表
*
* @param userListParam
* @return
*/
@Override
public Page<UserEntity> list(UserListParam userListParam) {
Pageable pageable = PageRequest.of(userListParam.getCurrentPage() - 1, userListParam.getPageSize());
Page<UserEntity> userDBPage = userRepository.findAll(pageable);
return userDBPage;
}
/**
* 更新(单条)
*
* @param userUpdateParam
* @return
*/
@Override
public UserEntity update(UserUpdateParam userUpdateParam) {
UserEntity userParam = new UserEntity();
BeanUtil.copyProperties(userUpdateParam, userParam, CopyOptions.create().ignoreNullValue());
userRepository.save(userParam);
return userParam;
}
/**
* 删除(单条)
*
* @param userDeleteParam
* @return
*/
@Override
public void delete(UserDeleteParam userDeleteParam) {
userRepository.deleteById(userDeleteParam.getId());
}
@Override
public void deleteBatch(UserDeleteBatchParam deleteBatchParam) {
List<UserEntity> list = new ArrayList<>();
UserEntity userEntity;
for (int i = 0; i < deleteBatchParam.getIds().length; i++) {
userEntity = new UserEntity();
userEntity.setId(deleteBatchParam.getIds()[i]);
list.add(userEntity);
}
userRepository.deleteAll(list);
}
}Spring Boot 已经将对MongoDB数据库的操作封装好了,直接按照 JPA 的操作方式来对数据进行增删改查即可。
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/controller/UserController.java
package com.ljq.demo.springboot.mongodb.controller;
import com.ljq.demo.springboot.mongodb.common.api.ApiResult;
import com.ljq.demo.springboot.mongodb.model.entity.UserEntity;
import com.ljq.demo.springboot.mongodb.model.param.*;
import com.ljq.demo.springboot.mongodb.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
*
*
* @author junqiang.lu
* @date 2021-01-06 20:03:33
*/
@Slf4j
@RestController
@RequestMapping(value = "/springboot/mongo/user")
@Api(value = "Mongo-用户控制层", tags = "Mongo-用户控制层")
public class UserController {
@Autowired
private UserService userService;
/**
* 保存(单条)
*
* @param userSaveParam
* @return
*/
@PostMapping(value = "/add", produces = {MediaType.APPLICATION_JSON_VALUE})
@ApiOperation(value = "Mongo-用户保存(单条)", notes = "用户保存(单条)")
public ResponseEntity<ApiResult> save(@Validated @RequestBody UserSaveParam userSaveParam) {
return ResponseEntity.ok(ApiResult.success(userService.save(userSaveParam)));
}
/**
* 查询详情(单条)
*
* @param userInfoParam
* @return
*/
@GetMapping(value = "/info", produces = {MediaType.APPLICATION_JSON_VALUE})
@ApiOperation(value = "Mongo-用户查询详情(单条)", notes = "用户查询详情(单条)")
public ResponseEntity<ApiResult> info(@Validated UserInfoParam userInfoParam) {
return ResponseEntity.ok(ApiResult.success(userService.info(userInfoParam)));
}
/**
* 查询列表
*
* @param userListParam
* @return
*/
@GetMapping(value = "/list", produces = {MediaType.APPLICATION_JSON_VALUE})
@ApiOperation(value = "Mongo-用户查询列表", notes = "用户查询列表")
public ResponseEntity<ApiResult> list(@Validated UserListParam userListParam) {
return ResponseEntity.ok(ApiResult.success(userService.list(userListParam)));
}
/**
* 修改(单条)
*
* @param userUpdateParam
* @return
*/
@PutMapping(value = "/update", produces = {MediaType.APPLICATION_JSON_VALUE})
@ApiOperation(value = "Mongo-用户修改(单条)", notes = "用户修改(单条)")
public ResponseEntity<ApiResult<UserEntity>> update(@Validated @RequestBody UserUpdateParam userUpdateParam) {
return ResponseEntity.ok(ApiResult.success(userService.update(userUpdateParam)));
}
/**
* 删除(单条)
*
* @param userDeleteParam
* @return
*/
@DeleteMapping(value = "/delete", produces = {MediaType.APPLICATION_JSON_VALUE})
@ApiOperation(value = "Mongo-用户删除(单条)", notes = "用户删除(单条)")
public ResponseEntity<ApiResult<Void>> delete(@Validated @RequestBody UserDeleteParam userDeleteParam) {
userService.delete(userDeleteParam);
return ResponseEntity.ok(ApiResult.success());
}
/**
* Mongo-用户批量删除
*
* @param deleteBatchParam
* @return
*/
@DeleteMapping(value = "/delete/batch", produces = {MediaType.APPLICATION_JSON_VALUE})
@ApiOperation(value = "Mongo-用户批量删除", notes = "Mongo-用户批量删除")
public ResponseEntity<ApiResult<Void>> deleteBatch(@Validated @RequestBody UserDeleteBatchParam deleteBatchParam) {
userService.deleteBatch(deleteBatchParam);
return ResponseEntity.ok(ApiResult.success());
}
}./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/DemoMongodbApplication.java
package com.ljq.demo.springboot.mongodb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author junqiang.lu
*/
@EnableSwagger2
@SpringBootApplication
public class DemoMongodbApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMongodbApplication.class, args);
}
}请求参数封装类
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserSaveParam.java
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserInfoParam.java
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserListParam.java
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserUpdateParam.java
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserDeleteParam.java
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserDeleteBatchParam.java
返回结果封装
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/common/api/ApiResult.java
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/common/api/ResponseCode.java
Spring Boot MongoDB CRUD Example
Introduction to Spring Data MongoDB
Spring 官方: Accessing Data with MongoDB
commit 79193910e046656407951ee1878a19a9cd2605bb (HEAD -> dev, origin/master, origin/dev, origin/HEAD, master)
Author: ljq <flying9001@gmail.com>
Date: Wed Jan 20 19:42:55 2021 +0800
代码-添加 Spring Boot 2.4 集成 MongoDB,实现基本CRUD版本回退命令
git reset --soft 79193910e046656407951ee1878a19a9cd2605bb