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 获取更多精彩文章!
欢迎关注微信公众号< 南瓜慢说 >,将持续为你更新...