SpringBoot集成Mongodb的操作方法
作者:小疙瘩的编程之路
1.什么是mongoDB?
MongoDB是一种非关系型数据库,被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活,支持动态查询和索引,也支持json格式和bson格式的数据存储,这种格式可以支持读取和写入大量的数据。
2.Docker安装mongoDB
2.1拉取镜像
docker pull mongo:4.4
2.2创建mongo数据持久化目录 (看自己爱好,放哪里都行)
mkdir -p /docker_volume/mongodb/data
2.3启动容器
docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
2.4创建用户
1.使用以下命令进入容器的 MongoDB shell:
docker exec -it mongo mongo admin
2.创建一个用户,mongo 默认没有用户
db.createUser({ user: 'root', pwd: 'xgd@123', roles: [ { role: 'readWriteAnyDatabase', db: 'admin' }, { role: 'dbAdminAnyDatabase', db: 'admin' } ] });
命令解释:
-d:表示在后台运行容器,并返回容器 ID。
-i:表示交互式运行容器,保留 STDIN 打开。
--name mongo-service:为容器指定一个名称,这里为 mongo-service。
--restart=always:表示在容器退出后自动重启容器。
-p 27017:27017:将容器的 27017 端口映射到宿主机的 27017 端口。
-v ~/data/mongodata:/data:将宿主机的 ~/data/mongodata 目录挂载到容器的 /data 目录下,用于持久化存储数据。
mongo:指定要运行的镜像名称,这里为官方的 MongoDB 镜像。
3.SpringBoot整合MongoDB步骤
1.导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2.配置
spring: data: mongodb: host: 你的ip port: 27017 username: root password: 123 authenticationDatabase: admin database: test
3.操作MongoDB 第一种方式使用MongoTemplate工具类 添加实体类
import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; import java.io.Serializable; import java.util.Date; /** * 映射表 test_demo */ @Data @Document("test_demo") public class TestDemo implements Serializable { private static final long serialVersionUID = 1L; private String id; private String name; private Date birthDay; }
测试
/** * MongoDB测试类 * */ @SpringBootTest(classes = MongoApplication.class) @RunWith(SpringRunner.class) public class MongoTest1 { @Autowired private MongoTemplate mongoTemplate; //保存 @Test public void saveTest(){ for (int i = 0; i < 10; i++) { TestDemo testDemo = new TestDemo(); testDemo.setName("张三"); testDemo.setBirthDay(new Date()); mongoTemplate.save(testDemo); } TestDemo testDemo = new TestDemo(); testDemo.setName("张三你吃饭了吗"); testDemo.setBirthDay(new Date()); mongoTemplate.save(testDemo); } //查询一个 @Test public void saveFindOne(){ TestDemo testDemo = mongoTemplate.findById("661743b77bee2f0a5739819d", TestDemo.class); System.out.println(testDemo); //TestDemo(id=661743b77bee2f0a5739819d, name=张三, birthDay=Thu Apr 11 09:58:15 CST 2024) } //条件查询 @Test public void testQuery(){ //查询字段name为张三的数据(多条件查询) Query query = Query.query(Criteria.where("name").is("张三")) .with(Sort.by(Sort.Direction.DESC,"birthDay")); // 执行查询 模糊查询 只查询5条数据 Query query1 = Query.query(Criteria.where("name").regex(".*?\\" + "张三" + ".*")); query.limit(5); List<TestDemo> list = mongoTemplate.find(query, TestDemo.class); List<TestDemo> list1 = mongoTemplate.find(query1, TestDemo.class); System.out.println("list:"+list); System.out.println("list1:"+list1); } //测试删除 @Test public void testDel(){ mongoTemplate.remove(Query.query(Criteria.where("name").is("张三")),TestDemo.class); } }
第二种方式使用继承MongoRepository
添加实体类
package com.xsp.spm.domain; import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; /** * @Author:xsp * @Description: * @name:User * @Date:2024/9/14 17:24 */ @Data @Document(collection = "users") public class User { @Id private String id; @Indexed(unique = true) private String name; private Integer age; }
repository层
package com.xsp.spm.repository; import com.xsp.spm.domain.User; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; /** * @Author:xsp * @Description: * @name:UserRepository * @Date:2024/9/14 17:25 */ @Repository public interface UserRepository extends MongoRepository<User, String> { }
controller层
package com.xsp.spm.controller; import com.xsp.spm.domain.User; import com.xsp.spm.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.web.bind.annotation.*; /** * @Author:xsp * @Description: * @name:UserController * @Date:2024/9/14 17:26 */ @RestController public class UserController { @Autowired private UserRepository userRepository; // 添加 @PostMapping public User createUser(@RequestBody User user) { return userRepository.save(user); } // 详细 @GetMapping("/{id}") public User getUser(@PathVariable String id) { return userRepository.findById(id).orElse(null); } // 删除 @DeleteMapping("/{id}") public void deleteUser(@PathVariable String id) { userRepository.deleteById(id); } // 修改 @PutMapping("/{id}") public User updateUser(@PathVariable String id, @RequestBody User user) { User userFromDb = userRepository.findById(id).orElse(null); if (userFromDb != null) { userFromDb.setName(user.getName()); userFromDb.setAge(user.getAge()); return userRepository.save(userFromDb); } return null; } // 列表 @GetMapping public Iterable<User> getAllUsers() { return userRepository.findAll(); } }
mongoDB 中MongoRepository和MongoTemplate的区别
MongoRepository:
特点:MongoRepository是Spring Data MongoDB的一部分,它提供了一种面向对象的方式来操作MongoDB。通过继承MongoRepository接口,可以很容易地实现CRUD操作和一些基本的查询操作。这种方式不需要编写原生的查询语句,使得操作更加简单和直观1。
适用场景:当查询需求简单,可以通过方法名命名规则进行快速的CRUD操作时,使用MongoRepository是一个不错的选择。它适用于基本的CRUD操作和一些简单查询,但如果需要执行复杂的聚合或定制查询,可能不够灵活1。
MongoTemplate:
特点:MongoTemplate是Spring Data MongoDB中更低级别的工具,它提供了更丰富的操作方法,包括条件查询、模糊查询、分页查询、数据修改和删除等。MongoTemplate允许更灵活的操作,包括原生的查询语句,提供了更大的灵活性来处理复杂的查询和数据操作2。
适用场景:当需要执行复杂的查询或定制操作时,MongoTemplate可以弥补MongoRepository的不足。它适用于需要更多控制和灵活性的场景,如执行复杂的聚合查询或定制的数据处理任务
总结来说,MongoRepository适合简单的CRUD操作和一些基本的查询需求,而MongoTemplate则提供了更丰富的功能和更大的灵活性,适用于需要执行复杂查询或定制操作的场景。选择使用哪一个取决于具体的应用需求和技术栈
4.navicat连接mongoDB
到此这篇关于SpringBoot集成Mongodb的文章就介绍到这了,更多相关SpringBoot集成Mongodb内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!