zoukankan      html  css  js  c++  java
  • 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式

    1 简介

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

    代码结构如下:

    code

    2 项目准备

    2.1 启动MongoDB实例

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

    2.2 引入相关依赖

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

    <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中如下:

    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>第一个为实体类,第二个为主键ID

    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 获取更多精彩文章!

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

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

  • 相关阅读:
    BZOJ2456: mode 众数卡空间
    BZOJ4128: Matrix 矩阵BSGS
    [SDOI2011]计算器 BSGS
    前台中文搜索到后台乱码
    批量删除实现js+springmvc
    基于Jquery+Ajax+Json实现分页显示
    分页条的制作
    input text中不能显示空格后的内容
    mysql存入中文乱码问题
    WEBROOT根目录 <%=request.getContextPath()%>
  • 原文地址:https://www.cnblogs.com/larrydpk/p/12735620.html
Copyright © 2011-2022 走看看