开发者社区> java自由人> 正文

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

简介: 记录一下SringBoot+Spring Data Mongodb,供大家借鉴和参考,同时也为了回顾一下知识,废话不多说直接上干货。
+关注继续查看

记录一下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项目

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

              Maven

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

            选择项目依赖文件,它将会自动导入到你的项目

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

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

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

            目录

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

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

                

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

    度娘会告诉你一切!!!

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

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

        下载Mongo插件

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

    

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

    

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

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

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

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

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

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

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

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

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

        目录

    再来对比一下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,仓库的意思),如图  

 包创建完成后,接下来实现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查询全部效果图,我的数据库插入三条数据,显示成功(亲测)

    页面效果:

    开发者工具返回数据:

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

 至此,我们已经成功的连接到了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君,我不生产代码,我只是代码的搬运工!!!


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
论Spring中循环依赖的正确性与Bean注入的顺序关系
最近在做项目时候遇到一个奇葩问题,就是bean依赖注入的正确性与bean直接注入的顺序有关系,但是正常情况下明明是和顺序没关系的啊,究竟啥情况那,不急,让我一一道来。
6632 0
Spring Boot 2.x基础教程:使用国产数据库连接池Druid
Spring Boot 2.x基础教程:使用国产数据库连接池Druid
108 0
十年经验产品经理分享:如何搭建一个行之有效的“数据闭环”体系
打造数据闭环体系,就是要完成数据对于产品产生价值的闭环,让数据驱动产品增长。本文作者从数据闭环的概念出发,结合具体案例,从目标、洞察、迭代、落地这四个方面对搭建数据闭环体系的关键要点进行了分析讨论,一起来看看~
2092 0
史上最快! 10小时大数据入门实战(八)- Hadoop 集成 Spring 的使用
目录 https://spring.io/projects/spring-hadoop 1 Spring Hadoop 开发环境搭建及访问 HDFS 文件系统 ...
1338 0
深入Spring Boot:Spring Context的继承关系和影响
## 前言 对于一个简单的Spring boot应用,它的spring context是只会有一个。 * 非web spring boot应用,context是[`AnnotationConfigApplicationContext`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/spring
1561 0
5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出
 1 固定集合 固定集合值得是事先创建而且大小固定的集合 2 固定集合的特征:固定集合很像环形队列,如果空间不足,最早文档就会被删除,为新的文档腾出空间。一般来说,固定集合适用于任何想要自动淘汰过期属性的场景,没有太多的操作限制。 3 创建固定集合使用命令: db.createCollection(“collectionName”,{capped:t
1255 0
+关注
java自由人
java开发工程师
6
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载