美文网首页SpringFrameworkspringbootSpring Boot 核心技术
第五十一章:基于SpringBoot2 & MongoD

第五十一章:基于SpringBoot2 & MongoD

作者: 恒宇少年 | 来源:发表于2018-04-16 23:25 被阅读1093次

    MongoDB在企业级项目中一般用于存储文档信息、图片资源等,MongoDB的内容完全是以 JSON字符串的形式进行存储的,所以我们在获取数据时通过简单的 反序列化就可以完成与项目内的实体类转换,不过这个过程是自动的,不需要我们手动进行反序列化处理。

    本章目标

    完成简单的SpringBootMongoDB的自动化整合,让我们像是使用spring-data-jpa的形式来完成MongoDB的数据操作。


    为你推荐

    1. 第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成
    2. 第四十八章:SpringBoot2.0新特性 - RabbitMQ信任package设置
    3. 第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer两种配置方式了吗?
    4. 第五十章:SpringBoot2.0新特性 - 岂止至今最简单redis缓存集成

    SpringBoot 企业级核心技术学习专题


    专题 专题名称 专题描述
    001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件
    002 Spring Boot 核心技术章节源码 Spring Boot 核心技术简书每一篇文章码云对应源码
    003 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解
    004 Spring Cloud 核心技术章节源码 Spring Cloud 核心技术简书每一篇文章对应源码
    005 QueryDSL 核心技术 全面讲解QueryDSL核心技术以及基于SpringBoot整合SpringDataJPA
    006 SpringDataJPA 核心技术 全面讲解SpringDataJPA核心技术
    007 SpringBoot核心技术学习目录 SpringBoot系统的学习目录,敬请关注点赞!!!

    准备MongDB

    我们使用MongoDB官方提供的安装方式进行安装,下面是对应系统的官方安装文档:

    1. Linux下安装MongoDB
    2. Windows下安装MongoDB
    3. OSX下安装MongoDB

    创建用户

    我们需要创建一个用户,用于本章的使用,如果你是OSX系统,只需要打开终端输入mongo命令就可以进入MongoDB的管理界面。

    1. 创建数据库
    使用 use test; 命令可以创建一个名为`test`的数据库
    2. 创建数据库所有者角色的用户
    db.createUser(
       {
         user: "test",
         pwd: "123456",
         roles: [ { role: "dbOwner", db: "test" } ]
       }
    );
    

    用户创建完成后就可以进行本章的编码了,环境有了之后我们接下来需要进行环境的连接进行操作数据。


    构建项目

    我们使用IDEA创建一个新的SpringBoot项目,在pom.xml配置文件内添加我们本章所需要的依赖,如下所示:

    <dependencies>
            <!--mongodb依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
            <!--lombok依赖-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <!--fastjson依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.44</version>
            </dependency>
            <!--测试依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    

    根据mongodb的依赖我们可以看到Spring家族式的设计,把所有操作数据的依赖都进行归类到spring-boot-starter-data-xxx下,我们比较常用到的如:spring-boot-starter-data-jpaspring-boot-starter-data-redis等。


    MongoRepository

    spring-boot-starter-data-mongodb确实采用了跟spring-boot-starter-data-jpa同样的方式来完成接口代理类的生成,并且提供了一些常用的单个对象操作的公共方法,MongoRepository接口作用与JPARepository一致,继承了该接口的业务数据接口就可以提供一个被Spring IOC托管的代理实现类,这样我们在注入业务数据接口时就会完成代理实现类的注入。
    废话不多说了,下面我们直接来创建一个名为CustomerRepository的数据接口,该接口继承MongoRepository<T,PK>,如下所示:

    /**
     * 客户数据接口
     * 继承自MongoRepository接口
     *
     * @author:于起宇 <br/>
     * ===============================
     * Created with IDEA.
     * Date:2018/3/28
     * Time:下午7:41
     * 简书:http://www.jianshu.com/u/092df3f77bca
     * ================================
     */
    public interface CustomerRepository extends MongoRepository<Customer, String> {
    }
    

    MongoRepository <T,PK>同样也是采用了两个泛型参数,
    T:实体类类型。
    PKT实体类内的主键类型,如:String。


    自定义实体类

    我们在CustomerRepository接口内使用了Customer实体类作为泛型参数,下面我们简单创建Customer实体类,内容如下所示:

    @Data
    public class Customer implements Serializable {
        /**
         * 客户编号
         */
        @Id
        public String id;
        /**
         * 客户名称
         */
        public String firstName;
        /**
         * 客户姓氏
         */
        public String lastName;
    
        public Customer(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
    }
    

    同样我们需要通过@Id注解进行设置主键,不过这个主键的值是MongoDB自动生成的,生成的主键值是具有唯一性的。


    添加配置

    代码已经准备好了,我们只需要添加MongoDB的一些配置信息就大功告成了,下面我们需要在application.yml配置文件内添加如下配置:

    spring:
      application:
        name: spring-boot-mongodb
      data:
        mongodb:
          uri: mongodb://localhost/test
          username: test
          password: 123456
    

    在上面配置的uri内的test即为数据库的名称,username配置我们自定义的用户名称,password配置为自定义用户设置的密码。

    上面我们的代码已经全部编写完成,接下来我们需要进行测试,来查看我们的CustomerRepository是否已经生效.


    测试

    我们使用CommandLineRunner接口进行简单的项目运行后就执行Customer文档内的数据操作,修改Chapter51Application入口类,添加CommandLineRunner接口的实现,如下所示:

    /**
     * 程序入口类
     * @author yuqiyu
     */
    @SpringBootApplication
    public class Chapter51Application implements CommandLineRunner {
        /**
         * logger instance
         */
        static Logger logger = LoggerFactory.getLogger(Chapter51Application.class);
        /**
         * 客户数据接口注入
         */
        @Autowired
        private CustomerRepository repository;
    
        public static void main(String[] args) {
            SpringApplication.run(Chapter51Application.class, args);
            logger.info("【【【【【SpringBoot整合Mongodb启动完成.】】】】】");
        }
    
        @Override
        public void run(String... args) {
            // 删除全部
            repository.deleteAll();
            // 添加一条数据
            repository.save(new Customer("于", "起宇"));
            // 查询全部
            logger.info(JSON.toJSONString(repository.findAll()));
        }
    }
    

    run方法内

    1. 删除了Customer文档内的全部内容
    2. 执行了保存数据的操作
    3. 查询出本次保存的数据内容

    下面我们来运行下程序查看控制台的效果,如下所示:

    [{"firstName":"于","id":"5ad4be1cab73ac0bdc23bd9a","lastName":"起宇"}]
    【【【【【SpringBoot整合Mongodb启动完成.】】】】】
    

    已经可以正常的输出了MongoDB我们添加到文档内的数据,在上面说到了id这个字段的特殊性,这是个分布式唯一性的字段值,是一个短板的md5格式的字符串。


    修改默认扫描路径

    如果你不打算使用SpringBoot默认的扫描路径(SpringBoot默认扫描XxxApplication类的同级以及所有子级的package)可以通过@EnableMongoRepositories注解配置basePackages属性完成自定义的MongoDBMongoRepository实现类的扫描,如下所示:

    @SpringBootApplication
    @EnableMongoRepositories(basePackages = "com.hengyu.chapter51")
    public class Chapter51Application implements CommandLineRunner { }
    

    总结

    本章简单的讲解了SpringBoot集成MongoDB,它与JPA有着同样的数据操作方式,数据接口通过继承MongoRepository就可以让我们可以使用与JPA相同的方法进行操作MongoDB文档内的数据,从而减少了学习的成本。

    本章源码已经上传到码云:
    SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter
    SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter
    SpringBoot相关系列文章请访问:目录:SpringBoot学习目录
    QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录
    SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录,感谢阅读!
    欢迎加入QQ技术交流群,共同进步。

    QQ技术交流群

    相关文章

      网友评论

      • IT人故事会:贵在坚持,么么哒!我也是个爱写文章的人

      本文标题:第五十一章:基于SpringBoot2 & MongoD

      本文链接:https://www.haomeiwen.com/subject/ybyjkftx.html