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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 MongoDB,通用型 2核4GB
简介: 记录一下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君,我不生产代码,我只是代码的搬运工!!!


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
11天前
|
存储 运维 关系型数据库
数据的力量:构筑现代大型网站之数据库基础与应用
数据的力量:构筑现代大型网站之数据库基础与应用
188 0
|
24天前
|
关系型数据库 MySQL 数据库连接
cas5.3 → 连接mysql数据库
cas5.3 → 连接mysql数据库
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL】学习如何通过DML更新数据库的数据
【MySQL】学习如何通过DML更新数据库的数据
89 0
|
24天前
|
数据采集 存储 缓存
SpringBoot与布隆过滤器的完美邂逅:高效防护大规模数据的奇妙结合【实战】
SpringBoot与布隆过滤器的完美邂逅:高效防护大规模数据的奇妙结合【实战】
15 0
|
2月前
|
SQL 存储 数据库连接
自动生成测试数据—数据库篇
自动生成测试数据—数据库篇
|
1天前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
21 2
|
3天前
|
数据库
【数据库】简单&连接&嵌套查询
【数据库】简单&连接&嵌套查询
13 2
|
4天前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因
【2月更文挑战第5天】PolarDB for MySQL数据库外网连接解析失败的原因
52 8
|
6天前
|
Java 数据库连接 数据库
Windows7 64位 连接Access数据库“未发现数据源名称并且未指定默认驱动程序“的解决办法
Windows7 64位 连接Access数据库“未发现数据源名称并且未指定默认驱动程序“的解决办法
|
7天前
|
SQL 关系型数据库 MySQL
Python中的数据库操作:SQLite与MySQL的连接
Python中的数据库操作:SQLite与MySQL的连接

热门文章

最新文章

相关产品

  • 云迁移中心