Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

时间:2021-05-20

1 简介

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

代码结构如下:

2 项目准备

2.1 启动MongoDB实例

为了方便,使用Docker来启动MongoDB,详细指导文档请参考:基于Docker的MongoDB实现授权访问的方法 ,这里不再赘述。

2.2 引入相关依赖

主要的依赖为Web和MongoDB的starter,把下面代码加入到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 配置数据库连接信息

与配置MySQL或Oracle一样,MongoDB也需要配置连接信息,配置在application.properties中如下:

server.port=8080spring.data.mongodb.authentication-database=adminspring.data.mongodb.database=testdbspring.data.mongodb.username=userspring.data.mongodb.password=123456spring.data.mongodb.host=localhostspring.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;@Repositorypublic 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测试后,每个接口均调用成功。就不一一截图了。

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;@Repositorypublic 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 测试

测试一样也是全部通过:

5 总结

本文通过实例讲解了如何整合Springboot和MongoDB,主要有两种方法:MongoRepository和MongoTemplate。代码基本在文章中已经贴出来了,需要的可以下载源代码。

链接: https://pan.baidu.com/s/1bSu4rIkK4f7UIIWW_fZT7A 提取码: 2uei

到此这篇关于Springboot整合MongoDB进行CRUD操作的两种方式的文章就介绍到这了,更多相关Springboot整合MongoDB crud 操作内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章