Springboot
是最简单的使用 Spring
的方式,而 MongoDB
是最流行的 NoSQL
数据库。两者在分布式、微服务架构中使用率极高,本文将用实例介绍如何在 Springboot
中整合 MongoDB
的两种方法: MongoRepository
和 MongoTemplate
。
代码结构如下:
为了方便,使用 Docker
来启动 MongoDB
,详细指导文档请参考: 用Docker安装一个MongoDB最新版玩玩 ,这里不再赘述。
主要的依赖为 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>
与配置 MySQL
或 Oracle
一样, 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
创建 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应用新增时会自动创建。
使用过 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
。
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); } }
注意代码没有做异常情况的判断和处理,这里为了快速演示,就先不管了。
用 Postman
测试后,每个接口均调用成功。就不一一截图了。
先定义接口为:
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); } }
这个 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); } }
测试一样也是全部通过:
本文通过实例讲解了如何整合 Springboot
和 MongoDB
,主要有两种方法: MongoRepository
和 MongoTemplate
。代码基本在文章中已经贴出来了,如果还不清楚,可以在 南瓜慢说 公众号回复< SpringbootMongoDB >获取代码。
欢迎访问 南瓜慢说 www.pkslow.com 获取更多精彩文章!
欢迎关注微信公众号< 南瓜慢说 >,将持续为你更新...