springboot整合mongodb入门

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`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值