MongoDB - 整合 SpringBoot 操作全流程

2024-06-04 2409阅读

目录

一、MongoDB 整合 SpringBoot

1.1、引入依赖

1.2、配置文件

1.3、集合操作

1.4、相关注解

1.5、文档操作

Tips:重要提示

1.5.1、查询

1.5.2、分页查询 + 排序

1.5.3、更新

1.5.4、删除

1.6、事务


一、MongoDB 整合 SpringBoot


1.1、引入依赖

        
            org.springframework.boot
            spring-boot-starter-data-mongodb
        

1.2、配置文件

spring:
  data:
    mongodb:
      uri: mongodb://192.168.73.3:27017/demo
      field-naming-strategy: org.springframework.data.mapping.model.SnakeCaseFieldNamingStrategy # 自动转驼峰
#      mongodb 一般不设置密码
#      username: root
#      password: 1111

uri 格式为: mongodb://ip 地址:mongodb 端口号/集合名

1.3、集合操作

Ps:以 demo 集合为例

a)创建集合

        if(!mongoTemplate.collectionExists("demo")) {
            //不存在才能创建,如果以及存在再创建就会报错
            mongoTemplate.createCollection("demo");
        }

b)删除集合

        mongoTemplate.dropCollection("demo1");

1.4、相关注解

a)@Document

  • 修饰范围:在类上.
  • 作用:映射当前类的一个对象为 mongo 的一条文档.
  • 属性:value 和 collection 都是用来表示操作的集合名.

    b)@Id

    • 修饰范围:成员变量、方法.
    • 作用:将值映射成文档的 _id.

      c)@Field

      • 修饰范围:成员变量、方法.
      • 作用:将值映射为文档中的一个 key 名称.

        d)@Transient

        • 修饰范围:成员变量、方法.
        • 租用:指定值不参与文档序列化.

          以 User 类为例:

          @Document("demo") //表示当前文档属于哪个集合
          public class User {
              @Id //当前类的 id 映射文档中的 _id
              private Integer id;
              private String name;
              private Integer age;
              @Field("work_day")  //当前类的 workDay 映射文档中的 work_day
              private Date workDay;
              public User(Integer id, String name, Integer age, Date workDay) {
                  this.id = id;
                  this.name = name;
                  this.age = age;
                  this.workDay = workDay;
              }
              @Override
              public String toString() {
                  return "User{" +
                          "id=" + id +
                          ", name='" + name + '\'' +
                          ", age=" + age +
                          ", workDay=" + workDay +
                          '}';
              }
              public Integer getId() {
                  return id;
              }
              public void setId(Integer id) {
                  this.id = id;
              }
              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 getWorkDay() {
                  return workDay;
              }
              public void setWorkDay(Date workDay) {
                  this.workDay = workDay;
              }
          }
          

          1.5、文档操作

          Tips:重要提示

          mongo 对类型有严格的要求.  例如根据 id 查询用户,你使用 String 类型的 id 作为 查询的参数,而 mongo 文档中保存的是 Long 类型的参数,此时你的查询记不起作用.

          这点需要跟 MySQL 区分开!!!

          1.5.1、查询

                  //1.查询所有
                  System.out.println("------------------------------------------------");
                  List users = mongoTemplate.findAll(User.class);
                  users.forEach(System.out::println);
                  //2.根据 id 查询指定文档
                  System.out.println("------------------------------------------------");
                  User byId = mongoTemplate.findById(1, User.class);
                  System.out.println(byId);
                  //3.根据查询条件进行查询(参数1: 查询条件, 参数2: 返回类型)
                  System.out.println("------------------------------------------------");
          //        mongoTemplate.find(new Query(), User.class);  //没有查询条件就是查询所有
                  //a) 等值查询
                  System.out.println("------------------------------------------------");
                  List users1 = mongoTemplate.find(Query.query(Criteria.where("name").is("周杰伦")), User.class);
                  users1.forEach(System.out::println);
                  //b) > 查询: gt()、>= 查询: gte() 、  
           
          

          1.5.2、分页查询 + 排序

              public List findPaginated(int page, int size) {  
                  // 创建查询对象  
                  Query query = new Query();  
            
                  // 添加过滤条件,如果有的话  
                  // query.addCriteria(Criteria.where("fieldName").is("value"));  
            
                  // 添加排序条件,如果有的话  
                  // query.with(Sort.by(Sort.Direction.ASC, "fieldName"));  
            
                  // 计算跳过的文档数量  
                  long skip = (page - 1) * size;  
            
                  // 设置查询的起始位置和返回的数量  
                  query.skip(skip).limit(size);  
            
                  // 执行查询并返回结果  
                  return mongoTemplate.find(query, MyDocument.class, "collectionName");  
              }

          1.5.3、更新

          更新指定字段的值.

                  //1.更新条件
                  Query query = Query.query(Criteria.where("name").is("周杰伦"));
                  //2.更新内容
                  Update update = new Update();
                  update.set("age", 20);
                  //a) 更新单条
                  mongoTemplate.updateFirst(query, update, User.class);
                  //b) 更新多条
                  mongoTemplate.updateMulti(query, update, User.class);
                  //c) 不存在就插入(存在就更新第一条)
                  mongoTemplate.upsert(query, update, User.class);
          

          指定某字段自增一,或者自减一.

                      mongoTemplate.updateFirst(
                              Query.query(
                                      Criteria
                                              .where("_id")
                                              .is(dto.getTargetId())
                              ),
                              new Update().inc("like_cnt", 1), //如果是 -1,就表示自减一
                              AlbumStatGO.class
                      );
          

          1.5.4、删除

                  //1.删除所有
                  mongoTemplate.remove(new Query(), User.class);
                  //2.条件删除
                  mongoTemplate.remove(Query.query(Criteria.where("name").is("林俊杰")), User.class);
          

          1.6、事务

          MongoDB 4.0 之后就支持事务了.

          但是开启事务的前提如下:

          a)开启集群模式(多副本集配置)

          b)进行如下配置:

          @Configuration
          class MongoTransaction {
              @Bean
              fun transactionManager(factory: MongoDatabaseFactory): MongoTransactionManager {
                  return MongoTransactionManager(factory)
              }
          }
          

          c)在需要回滚的地方加上 @Transactional 注解 

              @Transactional
              fun handler(dto: RegDto) {
                  userIdentRepo.save(dto)
                  throw AppException(ApiStatus.INVALID_PARAM, "这里故意触发异常,为了检验事务*-")
                  userDetailRepo.save(dto.id!!)
              }
          

          Ps:如果没有进行副本集的配置,就会报如下错误:

          MongoDB - 整合 SpringBoot 操作全流程 第1张

          MongoDB - 整合 SpringBoot 操作全流程 第2张


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]