第五十一章:基于SpringBoot2 & MongoDB完成自动化集成本章目标为你推荐企业级核心技术学习专题准备MongDB构建项目测试总结

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缓存集成

企业级核心技术学习专题

专题

专题名称

专题描述

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核心技术

准备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学习目录,感谢阅读!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Web项目聚集地

我珍藏的神兵利器(开发篇)

用了有些年头了,高效、顺滑。也是因为从IDEA开始,让我意识到工具的重要性,在折腾工具的这条路上越走越远。

12220
来自专栏纯洁的微笑

Spring Boot 2.0 版的开源项目云收藏来了!

12530
来自专栏编程

2017最全的Java学习方向

方向不对努力白费,Java技术的学习并不是一蹴而就的,正确的学习方向能让你事半功倍,如果你想在自己的Java学习之初就了解学Java又好又快的方法,那么这篇文章...

28050
来自专栏JackieZheng

学习SpringMVC——从HelloWorld开始

前言:   时隔十二年,中国女排最终过关斩将,用3:1的成绩证明了自己的实力,霸气夺冠,为中国赢得了一枚意义非常的金牌。这是一次全民的狂欢,一场视听盛宴,带给我...

22870
来自专栏Linyb极客之路

Java常用日志框架介绍

看了上面的介绍是否会觉得比较混乱,这些日志框架之间有什么异同,都是由谁在维护? 下文会逐一介绍。

24910
来自专栏王小雷

在PaaS上开发Web、移动应用(2)

在PaaS上开发Web、移动应用(2) PaaS学习笔记目录 PaaS基础学习(1) 在PaaS上开发Web、移动应用(2) PaaS优点与限制(3) 6. 巨...

22760
来自专栏高性能服务器开发

libevent源码深度剖析二 Reactor模式

(1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基本使...

26920
来自专栏Java帮帮-微信公众号-技术文章全总结

Java企业面试——SSM框架

SpringMvc简单介绍下你对springMVC的理解? Spring MVC Framework有这样一些特点: 它是基于组件技术的.全部的应用对象,无...

46250
来自专栏匠心独运的博客

实践Jenkins集成Cobertura自动化构建SpringBoot工程

文章摘要:追求代码质量一直都是优秀程序员对自己的目标,那么有什么好方法能够实现这个目标?

37430
来自专栏熊二哥

服务保障框架-Hystrix快速入门

祝大家国庆快乐! 对大部分电商和快递公司来说,每年年底(Q4季度)由于双11等大促活动的存在,将面对大量的用户流量,尤其是属于大促的那几天,无论是用户的商品订...

18810

扫码关注云+社区

领取腾讯云代金券