实例讲解Springboot整合MongoDB进行CRUD操做的两种方式

1 简介

Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。二者在分布式、微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合MongoDB的两种方法:MongoRepositoryMongoTemplatejava

代码结构以下:web

code

2 项目准备

2.1 启动MongoDB实例

为了方便,使用Docker来启动MongoDB,详细指导文档请参考:用Docker安装一个MongoDB最新版玩玩 ,这里再也不赘述。spring

2.2 引入相关依赖

主要的依赖为WebMongoDBstarter,把下面代码加入到pom.xml中便可:mongodb

<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>复制代码

2.3 配置数据库链接信息

与配置MySQLOracle同样,MongoDB也须要配置链接信息,配置在application.properties中以下:docker

server.port=8080

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=testdb
spring.data.mongodb.username=user
spring.data.mongodb.password=123456
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017复制代码

2.4 建立数据模型实体

建立User类以下:数据库

package com.pkslow.mongo.model;

import org.springframework.data.annotation.Id;
import java.util.Date;

public class User {
    @Id
    private String userId;
    private String name;
    private Integer age;
    private Date createTime = new Date();

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}复制代码

不须要在MongoDB中建立对应的Collections(表),当经过Web应用新增时会自动建立。微信

3 方式1:MongoRepository

3.1 定义数据访问层UserRepository

使用过Spring Jpa的都清楚,Repository实际就是用于操做数据库的类。在非关系型数据库MongoDB的整合中,也是同样的。Spring会帮咱们实现好对应接口的方法,开发人员连SQL都不用写,很是省心。代码以下:架构

package com.pkslow.mongo.dal;

import com.pkslow.mongo.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<User, String> {
}复制代码

注意MongoRepository后面接的泛型<User, String>第一个为实体类,第二个为主键IDapp

3.2 实现Controller

Controller比较基础,就不讲解了,经常使用的注解是必需要掌握的,直接上代码吧:分布式

package com.pkslow.mongo.contrlloer;

import com.pkslow.mongo.dal.UserRepository;
import com.pkslow.mongo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("")
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @GetMapping("/{userId}")
    public User getByUserId(@PathVariable String userId) {
        return userRepository.findById(userId).orElse(new User());
    }

    @PostMapping("")
    public User addNewUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @DeleteMapping("/{userId}")
    public String delete(@PathVariable String userId) {
        User user = new User();
        user.setUserId(userId);
        userRepository.deleteById(userId);
        return "deleted: " + userId;
    }

    @PutMapping("")
    public User update(@RequestBody User user) {
        return userRepository.save(user);
    }
}复制代码

注意代码没有作异常状况的判断和处理,这里为了快速演示,就先无论了。

3.3 测试

Postman测试后,每一个接口均调用成功。就不一一截图了。

repository.test

4 方式2:MongoTemplate

4.1 定义数据访问层UserDAL

先定义接口为:

package com.pkslow.mongo.dal;

import com.pkslow.mongo.model.User;
import java.util.List;

public interface UserDAL {
    List<User> findAll();

    User findById(String userId);

    User save(User user);

    void deleteById(String userId);
}复制代码

而后实现该接口以下:

package com.pkslow.mongo.dal;

import com.pkslow.mongo.model.User;
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.stereotype.Repository;
import java.util.List;

@Repository
public class UserDALImpl implements UserDAL {

    @Autowired
    private MongoTemplate template;

    @Override
    public List<User> findAll() {
        return template.findAll(User.class);
    }

    @Override
    public User findById(String userId) {
        return template.findById(userId,User.class);
    }

    @Override
    public User save(User user) {
        return template.save(user);
    }

    @Override
    public void deleteById(String userId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userId));
        template.remove(query, User.class);
    }
}复制代码

4.2 实现另外一个Controller

这个Controller的代码与以前的基本同样,只是数据访问类不同,代码以下:

package com.pkslow.mongo.contrlloer;

import com.pkslow.mongo.dal.UserDAL;
import com.pkslow.mongo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/userTemplate")
public class UserTemplateController {

    @Autowired
    private final UserDAL userDAL;

    public UserTemplateController(UserDAL userDAL) {
        this.userDAL = userDAL;
    }


    @GetMapping("")
    public List<User> getAllUsers() {
        return userDAL.findAll();
    }

    @GetMapping("/{userId}")
    public User getByUserId(@PathVariable String userId) {
        return userDAL.findById(userId);
    }

    @PostMapping("")
    public User addNewUser(@RequestBody User user) {
        return userDAL.save(user);
    }

    @DeleteMapping("/{userId}")
    public String delete(@PathVariable String userId) {
        User user = new User();
        user.setUserId(userId);
        userDAL.deleteById(userId);
        return "deleted: " + userId;
    }

    @PutMapping("")
    public User update(@RequestBody User user) {
        return userDAL.save(user);
    }
}复制代码

4.3 测试

测试同样也是所有经过:

template.test

5 总结

本文经过实例讲解了如何整合SpringbootMongoDB,主要有两种方法:MongoRepositoryMongoTemplate。代码基本在文章中已经贴出来了,若是还不清楚,能够在南瓜慢说公众号回复<SpringbootMongoDB>获取代码。


欢迎访问南瓜慢说 www.pkslow.com 获取更多精彩文章!

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写做,多整理。

相关文章
相关标签/搜索