• 【Java开发】 Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD:


    接下来介绍一下 NoSQL ,相比于 Mysql 等关系型的数据库,NoSQL (文档型数据库)由于存储的数据之间无关系,因此具备大数据量,高性能等特点,用于解决大规模数据集合多重数据种类带来的挑战,而 MongoDB 正是其中的代表,下一篇文章会介绍同类型的 Redis。

    目录

    1 Docker 环境下安装 MongoDB

    1.1 腾讯云服务器系统选择

    1.2 通过 Docker 启动 MongoDB

    ①获取镜像

    ②创建容器

    ③安全组

    ④测试连接

    2 SpringBoot 连接 MongoDB 及实现简单操作

    2.1 环境搭建

    ①创建项目

    ②添加配置(三选一)

    ③添加实体类

    2.2 基于 MongoTemplate 实现 CRUD

    ① MongoTemplate 常用操作

    ② Query对象

    ③ MongoTemplate 测试

    2.3 基于 MongoRepository 实现 CRUD

    ① 添加Repository类

    ② MongoRepository 测试


    源码地址:尹煜 / mongo_study · GitCode

    1 Docker 环境下安装 MongoDB

    1.1 腾讯云服务器系统选择

    趁着学生优惠购进了腾讯云轻量服务器,然后就倒腾各种服务器的配置了,为了简化搭建时的工作,直接上 Docker 容器,初次选择系统和重装系统都可以选择 Docker 镜像:

    1.2 通过 Docker 启动 MongoDB

    ①获取镜像

    docker pull mongo

    输出下载 mongo 的信息👇

    ②创建容器

    docker run --name mongo -p 27017:27017 -v ~/docker-data/mongo:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=root -d mongo

    反馈信息👇

    ③安全组

    ④测试连接

    使用 navicat 测试连接是否成功👇,这就大功告成了,Windows的话过程类似(前提是有Docker环境)~

     然后在 navicat 新建数据库👇

    2 SpringBoot 连接 MongoDB 及实现简单操作

    2.1 环境搭建

    ①创建项目

    通过编译器 IDEA 实现:

    ⅠNew Project

     Ⅱ 添加 MongoDB 依赖

    也可在之前的项目的 pom.xml 文件中直接添加,Spring 是对 MongoDB 做了进一步封装,放在Spring Data。

    ②添加配置(三选一)

    Ⅰ配置properties

    若 Spring Boot 版本合适,那么配置完 properties 后,就可以实现自动注入了

    路径:application.properties

    1. #springboot MongoDB配置
    2. spring.data.mongodb.username=root
    3. spring.data.mongodb.password=root
    4. spring.data.mongodb.authentication-database=root
    5. spring.data.mongodb.database=test
    6. spring.data.mongodb.host=localhost
    7. spring.data.mongodb.port=27017
    8. spring.data.mongodb.auto-index-creation=true

    Ⅱ 配置properties

    不过很可惜,由于我的 Spring Boot 版本过高-2.7.5,不支持自动注入MongoTemplate,因此需要手动创建 MongoDB 配置类👇

    路径:src/main/java/com/yinyu/mongodemo/config/MongoDBConfig.java

    1. @Configuration
    2. public class MongoDBConfig{
    3. @Bean
    4. public MongoClient mongoClient() {
    5. return MongoClients.create("mongodb://账号:密码@127.0.0.1:27017/");
    6. }
    7. @Bean
    8. public MongoTemplate mongoTemplate() {
    9. return new MongoTemplate(mongoClient(),"数据库");
    10. }
    11. }

    Ⅲ 继承 MongoDataAutoConfiguration

    也可在启动类中继承自动装配类👇,这样就不用手动写 Bean 了,当然也可在 MongoDB 配置类中继承

    路径:src/main/java/com/yinyu/mongodemo/MongodemoApplication.java

    1. @SpringBootApplication
    2. public class MongodemoApplication extends MongoDataAutoConfiguration {
    3. public static void main(String[] args) {
    4. SpringApplication.run(MongodemoApplication.class, args);
    5. }
    6. }

    ③添加实体类

    路径:src/main/java/com/yinyu/mongodemo/mongopojo/User.java

    1. @Builder
    2. @Data
    3. @Document("User")
    4. @AllArgsConstructor
    5. @NoArgsConstructor
    6. public class User {
    7. @Id
    8. private String id;
    9. @Indexed
    10. private String name;
    11. private Integer age;
    12. private String email;
    13. private String createDate;
    14. }

    2.2 基于 MongoTemplate 实现 CRUD

    ① MongoTemplate 常用操作

    • 新增
    mongoTemplate.insert(User)
    • 根据query内的查询条件删除
    mongoTemplate.remove(query, User.class)
    • 如果数据存在就更新,否则插入新的数据
    mongoTemplate.upsert(query, update, User.class)
    • 查询User文档的全部数据
    mongoTemplate.findAll(User.class)
    • 根据 id 查询User文档的数据
    mongoTemplate.findById(, User.class)
    • 根据query内的查询条件查询
    mongoTemplate.find(query, User.class)
    

    ② Query对象

    • 形式如下👇(query 对象用来封装所有条件对象,criteria对象用来构建条件)
    Query query = new Query(Criteria.where("name").is("yinyu").and("age").is(18));

    Ⅰ精准条件:Criteria.and(“key”).is(“条件”)

    Ⅱ 模糊条件:Criteria.and(“key”).regex(“条件”)

    Ⅲ 大于:Criteria.where(“key”).gt(“条件”)

    Ⅳ 小于:Criteria.where(“key”).lt(“条件”)

    Ⅵ 排序:query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))

    Ⅶ 添加封装条件:一个query中只能有一个andOperator(),其中 criteria 可为多个

    query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu")));

    ③ MongoTemplate 测试

    首先注入 MongoTemplate 👇

    1. @Autowired
    2. private MongoTemplate mongoTemplate;

    Ⅰinsert 新增

    1. @Test
    2. public void createUser() {
    3. User user = User.builder()
    4. .age(18)
    5. .name("yinyu")
    6. .email("yinyu@163.com")
    7. .createDate(new Date().toString()).build();
    8. User user1 = mongoTemplate.insert(user);
    9. System.out.println(user1);
    10. }

    可以看到数据插入成功,id 自动生成 👇 ,属于 User 类!

    Ⅱ findAll 查询所有

    1. @Test
    2. public void findAllUser() {
    3. List userList = mongoTemplate.findAll(User.class);
    4. userList.forEach(System.out::println);
    5. }

    查询成功👇

     Ⅲ findById 根据 Id 查询

    1. @Test
    2. public void findByIdUser() {
    3. User user = mongoTemplate.findById("6374e0b28c8fca48987da076",User.class);
    4. System.out.println(user);
    5. }

     Ⅳ find 根据query内的查询条件

    查询 name 包含 yin 、 age 大于 18 的记录:

    1. @Test
    2. public void findUser1() {
    3. Query query = new Query(Criteria
    4. .where("name").regex("yin")
    5. .and("age").gt(18));
    6. List userList = mongoTemplate.find(query, User.class);
    7. System.out.println(userList);
    8. }

    添加封装条件

    查询 name = yinyu 、 age = 18 的记录,可能这样会好理解一些

    1. @Test
    2. public void findUser2() {
    3. Query query = new Query();
    4. query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18)));
    5. List userList = mongoTemplate.find(query, User.class);
    6. System.out.println(userList);
    7. }
    8. @Test
    9. public void findUser3() {
    10. Criteria criteria = new Criteria();
    11. criteria.andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18));
    12. List userList = mongoTemplate.find(new Query(criteria), User.class);
    13. System.out.println(userList);
    14. }

    查询成功:👇 

    2.3 基于 MongoRepository 实现 CRUD

    Spring Data 提供了对 mongodb 数据访问的支持,我们只需要继承 MongoRepository 类,按照 Spring Data 规范就可以了。

    ① 添加Repository类

    路径:src/main/java/com/yinyu/mongodemo/repository/UserRepository.java

    1. @Repository
    2. public interface UserRepository extends MongoRepository {
    3. }

    ② MongoRepository 测试

    首先注入 MongoRepository 👇

    1. @Autowired
    2. private UserRepository userRepository;

    Ⅰsave 新增

    1. @Test
    2. public void saveTest(){
    3. User user = User.builder()
    4. .age(12)
    5. .name("yinyinyu")
    6. .email("yinyu@163.com")
    7. .createDate(new Date().toString()).build();
    8. User user1 = userRepository.save(user);
    9. System.out.println(user1);
    10. }

    新增成功👇

     Ⅱ findAll 查询所有

    和 MongoTemplate 不一样是,MongoRepository 的 findAll  不需要入参,因为在 Repository 类已经指定 User 类

    1. @Test
    2. public void findAllTest() {
    3. List userList = userRepository.findAll();
    4. userList.forEach(System.out::println);
    5. }

    查询成功👇

    Ⅲ findById 根据 id 查询

    注:结尾需要加 .get 才能获得获得数据,同时也可加 isPresent 用于判断该数据是否存在

    1. @Test
    2. public void getByIdTest1() {
    3. //获取数据
    4. User user = userRepository.findById("6374e0b28c8fca48987da076").get();
    5. System.out.println(user);
    6. }
    7. @Test
    8. public void getByIdTest2() {
    9. //判断该数据是否存在
    10. Boolean b = userRepository.findById("6374e0b28c8fca48987da076").isPresent();
    11. System.out.println(b);
    12. }

    Ⅳ findAll 根据Example查询

    1. @Test
    2. public void findExampleTest1() {
    3. User user = User.builder().name("yinyu").age(18).build();
    4. Example userExample = Example.of(user);
    5. List userList = userRepository.findAll(userExample);
    6. userList.forEach(System.out::println);
    7. }

    Ⅴ findAll 添加匹配器-matcher 模糊查询

    1. @Test
    2. public void findExampleTest2() {
    3. User user = User.builder().name("yinyu").age(18).build();
    4. //创建匹配器,即如何使用查询条件
    5. ExampleMatcher matcher = ExampleMatcher.matching()
    6. .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
    7. .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
    8. Example userExample = Example.of(user,matcher);
    9. List userList = userRepository.findAll(userExample);
    10. System.out.println(userList);
    11. }


    参考文章

    SpringBoot 2.5 整合MongoDB踩坑记录及解决方法_HellHellNo的博客-CSDN博客

    SpringBoot整合MongoDB及简单的操作_活跃的咸鱼的博客-CSDN博客_springboot+mongodb项目创建

  • 相关阅读:
    Electron是什么以及可以做什么
    C语言牛客网(NowCoder)刷题篇
    Qt5.15添加dll库如何指定库文件路径?
    HTML5 Canvas 超逼真烟花绽放动画
    PKDGAN: Private Knowledge Distillation with Generative Adversarial Networks
    操作字符串获取文件名字
    剑指 Offer II 040. 矩阵中最大的矩形
    Kotlin 中的协程 flow
    开源情报搜集系统的核心技术
    英语语法精讲合集
  • 原文地址:https://blog.csdn.net/weixin_51407397/article/details/127872686