springboot整合mongodb入门
文章目录
简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
安装
说明:
学习期间,我们使用docker安装,方便快捷
1.拉取镜像
docker pull mongo:latest
2.创建和启动容器
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
3.进入容器
docker exec -it mymongo/bin/bash
4.使用MongoDB客户端进行操作
mongo
5.查询所有的数据库
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
springboot整合monggo
集成简介
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足
初始化springboot工程
使用aliyun java initalizr去构建,很快,很方便
网址:https://start.aliyun.com/bootstrap.html?spm=a2ck6.17690074.0.0.1a822e7dmAfSVN
引入依赖
参考pom.xml
<?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>
<groupId>com.example</groupId>
<artifactId>springboot-mongo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mongo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
引入knife4j,添加配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("低版本版本")
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
return docket;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("swagger-bootstrap-ui-demo RESTful APIs")
.description("# swagger-bootstrap-ui-demo RESTful APIs")
.termsOfServiceUrl("http://www.xx.com/")
.contact("xx@qq.com")
.version("1.0")
.build();
}
}
编写实体类
User.class
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @ClassName: User
* @Author: 邵明
* @Date: 2021/8/16 06:44
* @Description:
*/
@Data
@Document("User")
public class User {
@Id
private String id;
private String name;
private Integer age;
private String email;
private String createDate;
}
R.class
import java.util.HashMap;
import java.util.Map;
/**
* renren开源项目封装号的JSON相应数据的类
* 返回数据
* @author Mark sunlightcs@gmail.com
*/
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public R() {
put("code", 0);
}
public static R error() {
return error(500, "未知异常,请联系管理员");
}
public static R error(String msg) {
return error(500, msg);
}
public static R error(int code, String msg) {
R r = new R();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static R ok(String msg) {
R r = new R();
r.put("msg", msg);
return r;
}
public static R ok(Map<String, Object> map) {
R r = new R();
r.putAll(map);
return r;
}
public static R ok() {
return new R();
}
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}
使用MongoRepository
import com.example.demo.mongo.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
测试MongoTemplate
import com.example.demo.mongo.User;
import com.example.demo.result.R;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
/**
* @ClassName: MongoController
* @author: 邵明
* @Date: 2021/8/16 07:28
*/
@Api(tags = "MongoTemplateController")
@Slf4j
@RestController
@RequestMapping("/mongoTemplate")
public class MongoTemplateController {
@Autowired
private MongoTemplate mongoTemplate;
/**
* @description 添加
* @author 邵明
* @date 2021/8/16 6:56
*/
@ApiOperation(value = "添加")
@PostMapping("/user")
public R createUser(@RequestBody User user) {
User userDb = mongoTemplate.insert(user);
return R.ok().put("data",userDb);
}
/**
* @description 查询所有
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "查询所有")
@GetMapping("/user")
public R findAll() {
List<User> userList = mongoTemplate.findAll(User.class);
return R.ok().put("data",userList);
}
/**
* @description 根据id查询
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "根据id查询")
@GetMapping("/user/{id}")
public R findById(@PathVariable String id) {
User user = mongoTemplate.findById(id, User.class);
return R.ok().put("data",user);
}
/**
* @description 条件查询
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "条件查询")
@ApiImplicitParams({
@ApiImplicitParam(name = "name",value = "用户姓名",required = true,dataType = "String"),
@ApiImplicitParam(name = "age",value = "年龄",required = true,dataType = "int")
})
@GetMapping("/user/doFilter")
public R doFilter(@RequestParam String name,@RequestParam Integer age) {
Query query = new Query(Criteria
.where("name").is(name)
.and("age").is(age));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
return R.ok().put("data",userList);
}
/**
* @description 模糊查询
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "模糊查询")
@ApiImplicitParam(name = "name",value = "用户姓名",required = true,dataType = "String")
@GetMapping("/user/like")
public R like(@RequestParam String name) {
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
List<User> userList = mongoTemplate.find(query, User.class);
return R.ok().put("data",userList);
}
/**
* @description 分页
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "分页")
@ApiImplicitParams({
@ApiImplicitParam(name = "name",value = "用户姓名",required = true,dataType = "string"),
@ApiImplicitParam(name = "pageNo",value = "当前页",required = true,dataType = "int"),
@ApiImplicitParam(name = "pageSize",value = "每页大小",required = true,dataType = "int"),
})
@GetMapping("/user/page")
public R page(@RequestParam(name = "name") String name,
@RequestParam(name = "pageNo") Integer pageNo,
@RequestParam(name = "pageSize") Integer pageSize) {
Query query = new Query();
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
int totalCount = (int) mongoTemplate.count(query, User.class);
List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
return R.ok().put("data",userList).put("total",totalCount);
}
/**
* @description 修改
* @author shaoming
* @date 2021/8/24 10:50
*/
@ApiOperation(value = "修改")
@PutMapping("/user")
public R updateById(@RequestBody User user){
String id = user.getId();
if(!Objects.nonNull(id)){
return R.error("更新失败,user的id不能为空");
}
Query query = new Query(Criteria.where("_id").is(id));
Update update = new Update();
update.set("name",user.getName());
update.set("age",user.getAge());
update.set("email",user.getEmail());
UpdateResult result = mongoTemplate.upsert(query, update, User.class);
//更新行数
long row = result.getMatchedCount();
return R.ok("根据id更新成功,成功影响的行数为: "+row);
}
/**
* @description 删除
* @author shaoming
* @date 2021/8/24 11:00
*/
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id",value = "用戶id",required = true,dataType = "String")
@DeleteMapping("/user/{id}")
public R deleteById(@PathVariable("id") String id){
Query query = new Query(Criteria.where("_id").is(id));
DeleteResult deleteResult = mongoTemplate.remove(query, User.class);
long deletedCount = deleteResult.getDeletedCount();
return R.ok("根据id刪除成功,成功影响的行数为: "+deletedCount);
}
}
测试MongoRepository
import com.example.demo.dao.UserRepository;
import com.example.demo.mongo.User;
import com.example.demo.result.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
/**
* @author shaoming
* @description
* @date: 2021/8/24 11:10
*/
@Api(tags = "MongoRepositoryController", description = "MongoRepository的api测试")//swagger注解,该controller的说明
@Slf4j//lombok注解,方便直接进行日志记录
@RestController//表示这是springmvc的controller层,并且这个类的所有方法都是以json格式返回给前端
@RequestMapping("/mongoRepository")//设置这个controlle的前缀url
public class MongoRepositoryController {
@Autowired
private UserRepository userRepository;
/**
* @description 添加
* @author 邵明
* @date 2021/8/16 6:56
*/
@ApiOperation(value = "添加")
@PostMapping("/user")
public R createUser(@RequestBody User user) {
User userDB = userRepository.save(user);
return R.ok().put("data",userDB);
}
/**
* @description 查询所有
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "查询所有")
@GetMapping("/user")
public R findAll() {
List<User> userList = userRepository.findAll();
return R.ok().put("data",userList);
}
/**
* @description 根据id查询
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "根据id查询")
@GetMapping("/user/{id}")
public R findById(@PathVariable String id) {
//Optinal是java8容器排除null的技术,不是mongo的技术
Optional<User> optUser = userRepository.findById(id);
User user = optUser.get();
return R.ok().put("data",user);
}
/**
* @description 条件查询
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "条件查询")
@ApiImplicitParams({
@ApiImplicitParam(name = "name",value = "用户姓名",required = true,dataType = "String"),
@ApiImplicitParam(name = "age",value = "年龄",required = true,dataType = "int")
})
@GetMapping("/user/doFilter")
public R doFilter(@RequestParam String name,@RequestParam Integer age) {
User user = new User();
user.setName(name);
user.setAge(age);
System.out.println(user);
Example<User> userExample = Example.of(user);
List<User> userList = userRepository.findAll(userExample);
return R.ok().put("data",userList);
}
/**
* @description 模糊查询
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "模糊查询")
@ApiImplicitParam(name = "name",value = "用户姓名",required = true,dataType = "String")
@GetMapping("/user/like")
public R like(@RequestParam String name) {
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
User user = new User();
user.setName(name);
Example<User> userExample = Example.of(user, matcher);
List<User> userList = userRepository.findAll(userExample);
return R.ok().put("data",userList);
}
/**
* @description 分页
* @author 邵明
* @date 2021/8/16 7:15
*/
@ApiOperation(value = "分页")
@ApiImplicitParams({
@ApiImplicitParam(name = "name",value = "用户姓名",required = true,dataType = "string"),
@ApiImplicitParam(name = "pageNo",value = "当前页",required = true,dataType = "int"),
@ApiImplicitParam(name = "pageSize",value = "每页大小",required = true,dataType = "int"),
})
@GetMapping("/user/page")
public R page(@RequestParam(name = "name") String name,
@RequestParam(name = "pageNo") Integer pageNo,
@RequestParam(name = "pageSize") Integer pageSize) {
Sort sort = Sort.by(Sort.Direction.DESC, "age");
//0为第一页
Pageable pageable = PageRequest.of(pageNo, pageSize, sort);
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
User user = new User();
user.setName(name);
//创建实例
Example<User> example = Example.of(user, matcher);
Page<User> pages = userRepository.findAll(example, pageable);
return R.ok().put("data",pages);
}
/**
* @description 修改
* @author shaoming
* @date 2021/8/24 10:50
*/
@ApiOperation(value = "修改")
@PutMapping("/user")
public R updateById(@RequestBody User user){
String id = user.getId();
User userDB = userRepository.findById(id).get();
BeanUtils.copyProperties(user,userDB);
User userSave = userRepository.save(userDB);
return R.ok().put("data",userSave);
}
/**
* @description 删除
* @author shaoming
* @date 2021/8/24 11:00
*/
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id",value = "用戶id",required = true,dataType = "String")
@DeleteMapping("/user/{id}")
public R deleteById(@PathVariable("id") String id){
userRepository.deleteById(id);
return R.ok();
}
}
项目网址
https://gitee.com/shao_ming314/springboot-mongo
erRepository.findById(id).get();
BeanUtils.copyProperties(user,userDB);
User userSave = userRepository.save(userDB);
return R.ok().put(“data”,userSave);
}
/**
* @description 删除
* @author shaoming
* @date 2021/8/24 11:00
*/
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id",value = "用戶id",required = true,dataType = "String")
@DeleteMapping("/user/{id}")
public R deleteById(@PathVariable("id") String id){
userRepository.deleteById(id);
return R.ok();
}
}
## 项目网址
`https://gitee.com/shao_ming314/springboot-mongo`