Document

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: {...}

与配置MySQLOracle一样,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的两种常见的方法:MongoRepositoryMongoTemplate。源码连接:https://files.cnblogs.com/files/blogs/721495/springboot-mongodb.zip?t=1647661956,觉得有帮助的话可以关注下公众号哈;


 

少年的志向,不应该是房子,他们应该伏案疾书,或为心中的梦想而挥洒汗水,畅想着自己未来光明的人生,少年的梦想,也不应该是生活,他们应该想要集齐七颗龙珠,或者幻想着拥有一颗皮卡丘。欢迎关注微信公众号<彭晓琪>

 

posted @ 2022-03-19 11:33  java请多指教  阅读(443)  评论(0编辑  收藏  举报