当前位置 博文首页 > RtxTitanV的博客:SpringBoot2.x 集成 SpringDataMongoDB

    RtxTitanV的博客:SpringBoot2.x 集成 SpringDataMongoDB

    作者:[db:作者] 时间:2021-06-20 12:13

    本文主要对SpringBoot2.x集成SpringDataMongoDB及其基本使用进行简单总结,其中SpringBoot使用的2.4.5版本。

    一、SpringDataMongoDB简介

    MongoDB是一个通用的、基于文档的分布式数据库,它将数据存储在类似JSON的文档中。

    Spring Data MongoDB是Spring Data项目的一部分,该项目旨在为新的数据存储提供熟悉且一致的基于Spring的编程模型,同时保留存储的特定特性和功能。Spring Data MongoDB项目提供与MongoDB文档数据库的集成。Spring Data MongoDB的关键功能领域是以POJO为中心的模型,用于与MongoDB的DBCollection交互并轻松编写Repository风格的数据访问层。

    二、集成SpringDataMongoDB

    通过maven新建一个名为springboot-data-mongodb的项目。

    1.引入依赖

    <!-- Spring Data MongoDB 起步依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- lombok插件 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
    </dependency>
    

    2.编写配置文件

    application.yml中进行如下配置:

    spring:
      data:
        mongodb:
          # MongoDB的uri连接
          # 集群可以配置为mongodb://username:password@ip:port,ip:port,ip:port
          uri: mongodb://root:root@localhost:27017/admin
          # 数据库
          database: test
    
    # 输出nosql日志
    logging:
      level:
        org:
          springframework:
            data:
              mongodb:
                core: debug
    

    3.创建实体类

    package com.rtxtitanv.model;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.experimental.Accessors;
    import org.bson.types.ObjectId;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    import org.springframework.data.mongodb.core.mapping.Field;
    
    import java.time.LocalDateTime;
    
    /**
     * @author rtxtitanv
     * @version 1.0.0
     * @name com.rtxtitanv.model.User
     * @description 用户实体类
     * @date 2021/5/26 18:34
     */
    @Accessors(chain = true)
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    @Document(collection = "user")
    public class User {
        @Id
        private ObjectId id;
        @Field(name = "username")
        private String username;
        @Field(name = "password")
        private String password;
        @Field(name = "realname")
        private String realname;
        @Field(name = "gender")
        private String gender;
        @Field(name = "age")
        private Integer age;
        @Field(name = "email")
        private String email;
        @Field(name = "user_point")
        private Integer userPoint;
        @Field(value = "user_level")
        private Byte userLevel;
        @Field(name = "birthday")
        private LocalDateTime birthday;
    }
    

    MongoDB要求要为所有文档的设置一个_id字段(field)。如果没有提供,驱动程序将会一个分配一个带有生成值的ObjectId。用@Idorg.springframework.data.annotation.Id)注解的属性或域(field)会映射到_id字段。没有注解但名为id的属性或域也会映射到_id字段。

    几个常用的映射注解:

    • @Id:应用于域上,以标记用于身份识别的字段(主键)。
    • @MongoId:应用于域上,以标记用于身份识别的字段(主键)。接受一个可选的FieldType来自定义id转换。
    • @Document:应用于类上,表示这个类是映射到数据库的候选。可以指定存储数据的集合的名称。
    • @Indexed:应用于域上,描述如何对字段进行索引。
    • @CompoundIndex(可重复):应用于类上,声明复合索引。
    • @Transient:默认情况下,所有实例域都被映射到文档中。这个注解排除了它所应用的实例域被存储在数据库中。Transient属性不能在持久化构造函数中使用,因为转换器不能为构造函数参数具体化一个值。
    • @Field:应用于域上,它允许描述字段的名称和类型。
    • @Version:应用于域上,用于乐观锁,并在保存操作中检查是否有修改。初始值为0(原始类型为1),在每次更新时都会自动增加。

    4.创建Repository接口

    package com.rtxtitanv.repository;
    
    import com.rtxtitanv.model.User;
    import org.bson.types.ObjectId;
    import org.springframework.data.mongodb.repository.MongoRepository;
    
    /**
     * @author rtxtitanv
     * @version 1.0.0
     * @name com.rtxtitanv.repository.UserRepository
     * @description UserRepository用来操作用户集合,此处的集合是MongoDB中的术语
     * @date 2021/5/26 18:34
     */
    public interface UserRepository extends MongoRepository<User, ObjectId> {}
    

    MongoRepository<User, ObjectId>中的类型参数User为实体类型,ObjectId为主键类型。

    5.创建测试类

    package com.rtxtitanv;
    
    import com.rtxtitanv.repository.UserRepository;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import javax.annotation.Resource;
    
    /**
     * @author rtxtitanv
     * @version 1.0.0
     * @name com.rtxtitanv.MongodbTest
     * @description SpringDataMongoDB单元测试类
     * @date 2021/5/26 18:11
     */
    @SpringBootTest
    class MongodbTest {
    
        @Resource
        private UserRepository userRepository;
        private static Logger logger = LoggerFactory.getLogger(MongodbTest.class);
    }
    

    三、基本使用

    MongoRepository接口中常用的数据操作方法:
    1
    继承MongoRepository接口之后就可以直接使用这些方法。在进行测试之前MongoDB的test数据库中没有Collection:
    2

    1.增加方法

    保存5条测试文档:

    /**
     * 保存测试,这里保存5条测试文档,一次插入一条文档
     * 使用方法 <S extends T> S save(S var1)
     */
    @Test
    void testSave() {
        User user;
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        user = userRepository.save(new User().setUsername("guanyuchang123").setPassword("a123456").setRealname("关羽")
            .setGender("男").setAge(28).setEmail("yunchang@xxx.com").setUserPoint(100).setUserLevel(Byte.valueOf("1"))
            .setBirthday(LocalDateTime.parse("1992-10-01 17:15:20", dateTimeFormatter)));
        logger.info(user.toString());
        user = userRepository.save(new User().setUsername("qiaolaoda888").setPassword("ss0635gh").setRealname("大乔")
            .setGender("女").setAge(20).setEmail("daqiao@xxx.com").setUserPoint(360).setUserLevel(Byte.valueOf("1"))
            .setBirthday(LocalDateTime.parse("2000-12-25 13:22:32", dateTimeFormatter)));
        logger.info(user.toString());
        user = userRepository.save(new User().setUsername("feige45").setPassword("qwer1234aa").setRealname("张飞")
            .setGender("男").setAge(25).setEmail("yide@xxx.com").setUserPoint(1000).setUserLevel(
    
    下一篇:没有了