MongoDB入门(一):整合Springboot连接配置以及CRUD操作的两种方式(源码+避坑)
源码下载:https://files.cnblogs.com/files/blogs/721495/springboot-mongodb.zip?t=1647661956
1、项目准备
1.1 确保云服务器中的mongo服务已启动
1.2 引入相关依赖
<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 配置mongo数据库连接信息(注意点)
如果你遇到了以下报错信息:
Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server XXXXXXX:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }
原因:MongoDB中每个数据库之间是相互独立的,都有独立的权限,正确的做法是使用root账号在【将要操作的数据库】中创建一个【子账号】,在用这个子账号连接mongo:
>use admin
switched to db admin
>db.auth("root","123456")
1
>show dbs
admin 0.000GB
config 0.000GB
good 0.000GB
>use good
switched to db good
> db.createUser({user:"daniel",pwd:"123456",roles:[{role:"dbOwner",db:"good"}]})
Successfully added user: {...}
与配置MySQL
或Oracle
一样,MongoDB
也需要配置连接信息,配置在application.properties
中如下:
spring.data.mongodb.uri=mongodb://daniel:123456@121.87.294.231:27017/good
解释:daniel用户名 123456密码 121.87.294.231服务器地址 27017端口 good数据库名
2.4 创建实体类对应于数据表
创建实体类User,与mysql关系型数据库不同,不需要在数据库中创建对应的表(也就是Mongo中的集合)与实体类对应,当通过Web会自动创建;
import org.springframework.data.annotation.Id;
public class User {
@Id
private String userId;
private Integer age;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3 方式1:MongoRepository
3.1 定义数据访问层UserRepository
定义操作数据库的接口UserRepository实现MongoRepository,在泛型中指明需要操作的实体类以及主键ID;
import com.example.springbootmongodb.domian.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
3.2 实现Controller
import com.example.springbootmongodb.domian.User;
import com.example.springbootmongodb.service.UserRepository;
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("/findAll")
public List<User> getAllUsers() {
return userRepository.findAll();
}
//保存用户
@PostMapping("/save")
public User addNewUser(@RequestBody User user) {
return userRepository.save(user);
}
//根据id去查找存在的用户
@GetMapping("/findById/{userId}")
public User getByUserId(@PathVariable String userId) {
return userRepository.findById(userId).orElse(new User());
}
//根据用户id删除指定用户
@DeleteMapping("/delete/{userId}")
public String delete(@PathVariable String userId) {
// User user = new User();
// user.setUserId(userId);
userRepository.deleteById(userId);
return "deleted: " + userId;
}
//更新用户信息
@PutMapping("/update")
public User update(@RequestBody User user) {
return userRepository.save(user);
}
}
3.3 测试
利用postman进行测试时注意请求的类型,防止出现405,请求方式不被允许
4 方式2:MongoTemplate
有点类似于RedisTemplate已经给你提供好了CRUD的模板方法,我们只需要根据我们自己的数据库去定义自己的
4.1 定义数据访问层UserDAL
首先定义我们自己的CRUD接口UserDAL
import com.example.springbootmongodb.domian.User;
import java.util.List;
public interface UserDAL {
List<User> findAll();
User findById(String userId);
User save(User user);
void deleteById(String userId);
}
实现这个接口,通过注入提供好的模板template去完善方法;
import com.example.springbootmongodb.domian.User;
import com.example.springbootmongodb.inte.UserDAL;
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
import com.example.springbootmongodb.domian.User;
import com.example.springbootmongodb.inte.UserDAL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/userTemplate")
public class SecondUserTemplateController {
@Autowired
private final UserDAL userDAL;
public SecondUserTemplateController(UserDAL userDAL) {
this.userDAL = userDAL;
}
@GetMapping("/findAll")
public List<User> getAllUsers() {
return userDAL.findAll();
}
@GetMapping("/findById/{userId}")
public User getByUserId(@PathVariable String userId) {
return userDAL.findById(userId);
}
@PostMapping("/save")
public User addNewUser(@RequestBody User user) {
return userDAL.save(user);
}
@DeleteMapping("/deleted/{userId}")
public String delete(@PathVariable String userId) {
User user = new User();
user.setUserId(userId);
userDAL.deleteById(userId);
return "deleted: " + userId;
}
@PutMapping("/update")
public User update(@RequestBody User user) {
return userDAL.save(user);
}
}
4.3 测试
5 总结
踩坑的地方主要是连接远程服务器中mongo数据库的连接配置,整合springboot和mongo的两种常见的方法:MongoRepository
和MongoTemplate。源码连接:https://files.cnblogs.com/files/blogs/721495/springboot-mongodb.zip?t=1647661956,觉得有帮助的话可以关注下公众号哈;
少年的志向,不应该是房子,他们应该伏案疾书,或为心中的梦想而挥洒汗水,畅想着自己未来光明的人生,少年的梦想,也不应该是生活,他们应该想要集齐七颗龙珠,或者幻想着拥有一颗皮卡丘。欢迎关注微信公众号<彭晓琪>