骗谁呢 發表於 2020-4-20 07:01:00

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

<h1 id="1-简介">1 简介</h1>
<p><code>Springboot</code>是最简单的使用<code>Spring</code>的方式,而<code>MongoDB</code>是最流行的<code>NoSQL</code>数据库。两者在分布式、微服务架构中使用率极高,本文将用实例介绍如何在<code>Springboot</code>中整合<code>MongoDB</code>的两种方法:<code>MongoRepository</code>和<code>MongoTemplate</code>。</p>
<p>代码结构如下:</p>
<p><img src="https://img2020.cnblogs.com/other/946674/202004/946674-20200420070100797-1205459233.jpg"></p>
<h1 id="2-项目准备">2 项目准备</h1>
<h2 id="21-启动mongodb实例">2.1 启动MongoDB实例</h2>
<p>为了方便,使用<code>Docker</code>来启动<code>MongoDB</code>,详细指导文档请参考:用Docker安装一个MongoDB最新版玩玩 ,这里不再赘述。</p>
<h2 id="22-引入相关依赖">2.2 引入相关依赖</h2>
<p>主要的依赖为<code>Web</code>和<code>MongoDB</code>的<code>starter</code>,把下面代码加入到<code>pom.xml</code>中即可:</p>
<pre><code class="language-xml">&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-data-mongodb&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
<h2 id="23-配置数据库连接信息">2.3 配置数据库连接信息</h2>
<p>与配置<code>MySQL</code>或<code>Oracle</code>一样,<code>MongoDB</code>也需要配置连接信息,配置在<code>application.properties</code>中如下:</p>
<pre><code class="language-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
</code></pre>
<h2 id="24-创建数据模型实体">2.4 创建数据模型实体</h2>
<p>创建<code>User</code>类如下:</p>
<pre><code class="language-java">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;
    }
}
</code></pre>
<p>不需要在<code>MongoDB</code>中创建对应的<code>Collections</code>(表),当通过Web应用新增时会自动创建。</p>
<h1 id="3-方式1mongorepository">3 方式1:MongoRepository</h1>
<h2 id="31-定义数据访问层userrepository">3.1 定义数据访问层UserRepository</h2>
<p>使用过<code>Spring Jpa</code>的都清楚,<code>Repository</code>实际就是用于操作数据库的类。在非关系型数据库<code>MongoDB</code>的整合中,也是一样的。<code>Spring</code>会帮我们实现好对应接口的方法,开发人员连<code>SQL</code>都不用写,非常省心。代码如下:</p>
<pre><code class="language-java">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&lt;User, String&gt; {
}
</code></pre>
<p>注意<code>MongoRepository</code>后面接的泛型<code>&lt;User, String&gt;</code>第一个为实体类,第二个为主键<code>ID</code>。</p>
<h2 id="32-实现controller">3.2 实现Controller</h2>
<p><code>Controller</code>比较基础,就不讲解了,常用的注解是必须要掌握的,直接上代码吧:</p>
<pre><code class="language-java">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&lt;User&gt; 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);
    }
}
</code></pre>
<p>注意代码没有做异常情况的判断和处理,这里为了快速演示,就先不管了。</p>
<h2 id="33-测试">3.3 测试</h2>
<p>用<code>Postman</code>测试后,每个接口均调用成功。就不一一截图了。</p>
<p><img src="https://img2020.cnblogs.com/other/946674/202004/946674-20200420070105430-429822646.jpg"></p>
<h1 id="4-方式2mongotemplate">4 方式2:MongoTemplate</h1>
<h2 id="41-定义数据访问层userdal">4.1 定义数据访问层UserDAL</h2>
<p>先定义接口为:</p>
<pre><code class="language-java">package com.pkslow.mongo.dal;

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

public interface UserDAL {
    List&lt;User&gt; findAll();

    User findById(String userId);

    User save(User user);

    void deleteById(String userId);
}
</code></pre>
<p>然后实现该接口如下:</p>
<pre><code class="language-java">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&lt;User&gt; 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);
    }
}
</code></pre>
<h2 id="42-实现另一个controller">4.2 实现另一个Controller</h2>
<p>这个<code>Controller</code>的代码与之前的基本一样,只是数据访问类不一样,代码如下:</p>
<pre><code class="language-java">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&lt;User&gt; 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);
    }
}
</code></pre>
<h2 id="43-测试">4.3 测试</h2>
<p>测试一样也是全部通过:</p>
<p><img src="https://img2020.cnblogs.com/other/946674/202004/946674-20200420070105920-1580427006.jpg"></p>
<h1 id="5-总结">5 总结</h1>
<p>本文通过实例讲解了如何整合<code>Springboot</code>和<code>MongoDB</code>,主要有两种方法:<code>MongoRepository</code>和<code>MongoTemplate</code>。代码基本在文章中已经贴出来了,如果还不清楚,可以在<strong>南瓜慢说</strong>公众号回复&lt;<strong>SpringbootMongoDB</strong>&gt;获取代码。</p>
<hr>
<p>欢迎访问南瓜慢说 www.pkslow.com 获取更多精彩文章!</p>
<p>欢迎关注微信公众号&lt;<strong>南瓜慢说</strong>&gt;,将持续为你更新...</p>
<p><img src="https://img2020.cnblogs.com/other/946674/202004/946674-20200420070106207-1876552389.jpg"></p>
<p><strong>多读书,多分享;多写作,多整理。</strong></p><br><br>
来源:https://www.cnblogs.com/larrydpk/p/12735620.html
頁: [1]
查看完整版本: 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式