SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

时间:2021-01-06 06:54:08

编写背景:

    最近微信小程序特别火,为了抢占先机,跟几个基友接了个微信小程序项目,而我则负责写API数据接口,要求使用SpringBoot框架和MongoDB非关系型数据库。问题来了,怎么整合?啥是NoSql?我该干啥?于是疯了一样的游遍各大论坛,以至于百度上凡是带SpringBoot+Spring Data MongoDB关键字的精彩文章都认识我,说起这件事,不能提,一提都是泪,明明跟码云上各路大神编写的一模一样,可我的就是Bug!Bug!Bug!我也曾怀疑过可能是我注释跟他们不一样(^_^开个玩笑)。最后我决定取其精华,弃其糟粕,利用注释排错法,一个个查,一个个试,佛祖保佑,就在昨晚终于测试成功了。

    为了防止各位初识SringBoot+Spring Data Mongodb的程序猿不在入坑(我也怕明天忘了),于是我决定用我的编码五分钟,卡机两小时的笔记本连夜记录下来,供大家借鉴和参考,废话不多说直接上干货。(注:个人使用的IDE是IDEA,MyEclipse控的朋友也可参考以下示例,差别不大)

SpringBoot(有基础的可以直接忽略):

    SpringBoot的基本概念和优缺点这里就不说了,百度查一下没有太大的区别,算了,缺点说一下吧!Bug不好解决!Bug不好解决!Bug不好解决!因为它把许多配置文件都给封装好了,最后只留一个application.xml来配置各项属性,所以系统报错不好解决,但是无可否认,它确实实现了“约定大于配置”的核心理念。

    首先熟悉一下常用的SpringBoot注解:

    1.@SpringBootApplication: 指定让SpringBoot自动给程序入口进行必要的配置,等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。 

    2.@RestController:用于标注控制层组件(通常加在Controller头部),它是SpringBoot提供的基于@ResponseBody和@Controller的合集。 

    3.@EnableAutoConfiguration:Spring Boot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。

    4.@ComponentScan:表示将该类自动发现扫描组件。如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean。

    5.@Configuration:相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

    6.@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。

    7.@Controller:用于定义控制器类,在spring 项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。

    8.@ResponseBody:表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。

    创建SpringBoot项目:通常可以使用以下两种方式创建(注:以下任何操作的一切前提是你的电脑成功      的安装了Maven项目构建工具,首次使用Maven请保持网络畅通,它需要下载你所依赖的jar文件)

        1.本地新建IDEA项目(推荐)

               ①这里选中IDEA支持的SpringBoot项目,按下图指示单击下一步(自己动手来试一试)

             SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

            ②对这个Maven项目进行命名并选择你的java版本,单击下一步(Maven知识不做赘述)

              SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

            ③注意这里勾选你的项目依赖jar文件,它将会在你生成项目时自动导入你所选的jar文件(神奇不)              这里咱们勾选Web和MongoDB即可,下面的SpringBoot版本可以证明我没pian你,单击下一                    步。(注意一定按步骤来)

            SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

            ④这里就不配图了,直接单击Finish项目就创建成功了。

            ⑤打开你的项目,如果目录结构跟下面一致,恭喜你成功创建了使用Maven架构搭建的SpringBoot

             项目了(首次加载可能会慢一点,因为你的pom.xml需要下载指定的jar包)

            SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

      2. 服务器端下载IDEA项目压缩包

                点击如图蓝色标注的链接http://start.spring.io访问官网直接下载压缩包并解压到本地导入即可                    使用,方式同上,这里不做过多解释,为了防止天灾,建议使用第一种方式。

                SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

安装MongoDB数据库(推荐官方管理工具NoSQL Manager for MongoDB)

    度娘会告诉你一切!!!

重头戏:大家期待已久的SpringBoot+Spring Data Mongo

    在IDEA中下载插件Mongo使你的IDE连接MongoDB数据库,下载完成需要重启IDEA生效(可选)

        SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

    重启好之后,你的IDE右侧会有一个Mongo Explorer的面板,展开并点击配置按钮弹出对话框,来配置      你的MongoDB数据库,点击右侧加号,即可配置你的MongoDB数据库

    SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

    数据库没有分配用户名和密码可参考下图,测试成功点击OK即可;

    SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

    如果你选择硬刚,那么我们直接开始下一步,不要紧 

        打开我们原来创建好的SpringBoot项目,首先解释一下目录(...还是配图吧...大图...1080p),咳                  咳,首先解释一下目录,这里重点解释main,test包及子包以及pom.xml配置文件(重点)

        main:盛放业务的主体,有Maven基础的朋友可以略过

                java:主要是我们的业务逻辑类及程序入口,注意这里的SbmDemoApplication是我们程序的

                入口,它必须放在项目根目录(注意),因为启动程序时它只会依次的自动扫描所在包及子包的文件。

                resources:配置文件及静态资源,其下有一个非常神奇的配置文件                                                              application.xml,SpringBoot只有这一个配置文件即可完成所有配置,并且

                所有需要的属性SpringBoot已经帮我们默认配置好了,它跟Maven功能类似,Maven是整合了

                所有jar包,而它整合了繁琐的配置文件。我们只需配置个别属性即可。

         test:这就是我们通常说的单元测试,它可以帮我们测试某个功能模块,大家自己体验就好。

        SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

    再来对比一下pom.xml配置文件,因为这是它所依赖的所有jar文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>org.mongodb</groupId>
   <artifactId>mongodb_os</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>mongodb_os</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.2.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-mongodb</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>commons-dbcp</groupId>
         <artifactId>commons-dbcp</artifactId>
         <version>1.4</version>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
</project>

    pom.xml没问题后,我们打开application.xml来为MongDB数据库配置连接池,很简单,这就体现了Spring Boot的强大之处,如下图,SpringBoot内置Tomcat服务器,我们可以自行配置它的属性(注:我这里的测试数据库没有用户名和密码所以uri并没有写入),配置文件只写这三行就够了(俯瞰众生),继续向下看。

    ps:MyEclipse工具在写配置文件注释时需要改变页面编码格式为UTF-8;

#服务器端口号
server.port=8080
#加入sbm_demo前缀
server.servlet.context-path=/sbm_demo

#连接MongoDB数据库
spring.data.mongodb.uri=mongodb://localhost:27017/test

    配置文件没问题后,在你的项目目录下创建我们常用的三个包,分别是Controller,entity,dao(这里我改名为repository,仓库的意思),如图  

SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

 包创建完成后,接下来实现java程序从MongoDB非关系型数据库读取数据,既然要读取数据,那肯定需要数据持久化类(实体类),有项目经验的都知道关系型数据库如MySQL,Oracle等,程序的实体类对应它们的表,而非关系型数据库如MongoDB的实体类跟关系型数据库有些不同,MongDB没有表这个概念,它们统称集合(Collection),所以这里我们的实体类要对应MongDB集合,而实体类的属性则根据MongDB集合下的文档来创建,如下图是我测试用的实体类,下面来解释下实体类要注意的地方。

    @Document和@Id是Spring Data MongoDB提供的注解,@Document和@Entity相似,它是用来告诉程序我这个实体类是一个非关系型数据库的文档,而里面的collection指向数据库的某个集合,我这里的预先在数据库创建好的集合就叫test,如果不指定collection的值,程序会在你调用到这个类的时候自动根据名字去匹配数据库的集合,为了防止出错,通常会手动指定。@Id是文档的唯一标识,在MongoDB中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成,Spring Data MongoDB还提供了例如@Indexed,@DBref等,我们测试程序基本功能只需要这几个就够了,这里我们把重点放在数据交互上,大家有兴趣的可以自行百度它们的概念。

package org.springboot_mongodb.sbm_demo.entity;

import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="test")
public class Test {
    @Id
    private ObjectId objectId;
    private String title;
    private String description;
    private Integer likes;
    private String by;

    public ObjectId getObjectId() {
        return objectId;
    }

    public void setObjectId(ObjectId objectId) {
        this.objectId = objectId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getLikes() {
        return likes;
    }

    public void setLikes(Integer likes) {
        this.likes = likes;
    }

    public String getBy() {
        return by;
    }

    public void setBy(String by) {
        this.by = by;
    }
}

  我们有了实体类还不够,我们还需要一个Dao接口,接口名字自定义,我这里叫TestRepository,但这个接口必须继承MongoRepository<T,ID>才能让我们成功的从MongoDB数据库获取数据。T代表你的实体类名称,ID代表你的实体类唯一键。

    仔细看下代码,我定义了两方法,一个是父接口重写来的,一个是自定义的,这就是Spring Data的神奇的地方,Spring Data它支持继承过来的方法,自定义方法,当我们只需要做简单的增删改查时可直接继承父类所提供的方法,当我们们要做复杂查询时,也可以自定义方法进行查询,根本不需要再去写一些各种SQL语句,但要注意自定义方法要符合它的命名规则,如我下面的方法findByTitle(String title),意思是通过标题查询测试信息,具体命名规则可百度搜文档查看。做完这些操作以后,再往下看!!!

package org.springboot_mongodb.sbm_demo.repository;

import org.bson.types.ObjectId;
import org.springboot_mongodb.sbm_demo.entity.Test;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface TestRepository extends MongoRepository<Test,ObjectId> {

    Test findByTitle(String title);

    @Override
    List<Test> findAll();
}

接口写好了,我们可以来写我们的Controller来实现测试方法,有业务逻辑强迫症的朋友可以自行定义Service业务层,我这里直接通过Controller来实现,看代码

   这里我使用了SpringBoot中的@RestController注解,并没有使用@Controller和@RequestMapping,因为我发现在Controller类上声明了路由后,运行程序时Tomcat不报错,但是访问页面反馈404,目前没有解决只好先用@RestController注解,希望有朋友解决的话,告诉jiapeng君,不胜感激,那么我就只能在方法上声明路由(无奈);

    首先通过@Autowired注解Spring会自动实现我们的接口,定义两个方法实现接口中的查询,并在方法头部使用@RquestMapping声明路由信息,服务器GET请求,返回数据到客户端就OK了(简单明了~);

package org.springboot_mongodb.sbm_demo.controller;

import org.springboot_mongodb.sbm_demo.entity.Test;
import org.springboot_mongodb.sbm_demo.repository.TestRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class TestController {

    @Autowired
    private TestRepository testRepository;

    @RequestMapping(value = "/test_mongodb",method = RequestMethod.GET)
    public Test test_mongodb(){
        Test test = testRepository.findByTitle("MongoDB");
        return test;
    }

    @RequestMapping(value = "/testList",method = RequestMethod.GET)
    public List<Test> testList(){
        List<Test> testList = testRepository.findAll();
        return testList;
    }
}

最后一步,再次检查一下你的项目目录,特别注意一下SbmDemoApplication的位置必须在项目根目录,它是程序运行的入口,其次保证你的application.xml配置信息无差错,实体类映射无差错,并且数据库至少有一条测试数据。那么打开你的SbmDemoApplication,右键Run SbmDemoApplication运行程序就可以啦。(下面会有两个路径的效果图)

package org.springboot_mongodb.sbm_demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SbmDemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(SbmDemoApplication.class, args);
   }
}

访问http://localhost:8080/sbm_demo/testList查询全部效果图,我的数据库插入三条数据,显示成功(亲测)

    页面效果:

SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

    开发者工具返回数据:

SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

访问http://localhost:8080/sbm_demo/test_mongodb根据标题查询单条数据效果图,显示成功(亲测)

SpringBoot+Spring Data MongoDB实现与MongDB非关系型数据库的数据连接【项目实战经验分享】

 至此,我们已经成功的连接到了MongoDB数据库,也体验到了SpringBoot和SpringData的厉害,如果你跟着jiapeng君的步骤测试成功了,请你在程序员的道路上坚定走下去(颈椎病康复指南和活着这两本书很不错),点赞慢走不送;如果你跟jiapeng君的经历一样(测试N遍不成功),那么下方的彩蛋或可以小小的安慰你一下,请拿走,或许对你有用。

彩蛋:

    百度云资源分享:https://pan.baidu.com/s/1g2Yex-pBoSHnItRrhycscQ  密码:8e5w

    介绍:一个资深程序员的校园o2o实战项目视频讲解,项目主要使用SSM框架+MySQL数据库实现后台功能,第10章之后将项目框架大换血为SpringBoot框架+MySQL数据库,思路清晰,讲解细腻,声音洪亮,非常适合没有实战经验的程序猿和想学习SpringBoot却不知从何下手的程序猿(慕课网收费o(╥﹏╥)o)

    注意事项:看视频过程中如果有卡顿,或者变声等等不可控的情况保存到你的网盘并在手机上观看即可,且本视频资源不可用作商业用途,如有侵权行为请联系作者QQ:1093964643或发送到邮箱:lv1093964643@163.com

    ps:明明设置了永久有效但还是会过期,过期请在下方评论或者直接联系jiapeng君补发链接,

    MongoDB中文文档:http://docs.mongoing.com/security.html

    介绍:一个还没被完全翻译的中文文档,不过猜测翻译者应该会持续翻译更新


谢谢大家的支持,你们的支持会使我更有动力来分享我的经验;我是jiapeng君,我不生产代码,我只是代码的搬运工!!!