Spring Boot 与 Kotlin 使用MongoDB数据库

我们在产品中用到NoSQL数据库MongoDB

下面就来简单介绍一下MongoDB,并且通过一个例子来介绍Spring Boot中对MongoDB访问的配置和使用。

MongoDB简介

MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。

MongoDB支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型,也因为他的存储格式也使得它所存储的数据在Nodejs程序应用中使用非常流畅。

既然称为NoSQL数据库,Mongo的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

但是,MongoDB也不是万能的,同MySQL等关系型数据库相比,它们在针对不同的数据类型和事务要求上都存在自己独特的优势。在数据存储的选择中,坚持多样化原则,选择更好更经济的方式,而不是自上而下的统一化。

较常见的,我们可以直接用MongoDB来存储键值对类型的数据,如:验证码、Session等;由于MongoDB的横向扩展能力,也可以用来存储数据规模会在未来变的非常巨大的数据,如:日志、评论等;由于MongoDB存储数据的弱类型,也可以用来存储一些多变json数据,如:与外系统交互时经常变化的JSON报文。而对于一些对数据有复杂的高事务性要求的操作,如:账户交易等就不适合使用MongoDB来存储。

访问MongoDB

在Spring Boot中,对如此受欢迎的MongoDB,同样提供了自配置功能。

引入依赖

Spring Boot中可以通过在pom.xml中加入spring-boot-starter-data-mongodb引入对mongodb的访问支持依赖。它的实现依赖spring-data-mongodb。是的,您没有看错,又是spring-data的子项目,之前介绍过spring-data-jpa、spring-data-redis,对于mongodb的访问,spring-data也提供了强大的支持,下面就开始动手试试吧。

compile "org.springframework.boot:spring-boot-starter-data-mongodb:$spring_boot_version"

完整build.gradle

1group 'name.quanke.kotlin' 2version '1.0-SNAPSHOT' 3 4buildscript { 5 ext.kotlin_version = '1.2.10' 6 ext.spring_boot_version = '1.5.4.RELEASE' 7 ext.springfox_swagger2_version = '2.7.0' 8 ext.mysql_version = '5.1.21' 9 repositories { 10 mavenCentral() 11 } 12 dependencies { 13 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 14 classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version") 15 16// Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置open类插件 17 classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version") 18 classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version") 19 } 20} 21 22apply plugin: 'kotlin' 23apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin 24apply plugin: 'org.springframework.boot' 25apply plugin: "kotlin-jpa" //https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell 26jar { 27 baseName = 'chapter11-6-4-service' 28 version = '0.1.0' 29} 30repositories { 31 mavenCentral() 32} 33 34 35dependencies { 36 compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 37 compile("org.jetbrains.kotlin:kotlin-reflect:${kotlin_version}") 38 39 40 compile "org.springframework.boot:spring-boot-starter-web:$spring_boot_version" 41// compile "org.springframework.boot:spring-boot-starter-data-jpa:$spring_boot_version" 42 compile "org.springframework.boot:spring-boot-starter-data-mongodb:$spring_boot_version" 43 44 testCompile "org.springframework.boot:spring-boot-starter-test:$spring_boot_version" 45 testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" 46 47} 48 49compileKotlin { 50 kotlinOptions.jvmTarget = "1.8" 51} 52compileTestKotlin { 53 kotlinOptions.jvmTarget = "1.8" 54}

快速开始使用Spring-data-mongodb

若MongoDB的安装配置采用默认端口,那么在自动配置的情况下,我们不需要做任何参数配置,就能马上连接上本地的MongoDB。下面直接使用spring-data-mongodb来尝试对mongodb的存取操作。(记得mongod启动您的mongodb)

创建要存储的User实体,包含属性:id、username、age

1import org.springframework.data.annotation.Id 2import org.springframework.data.mongodb.core.mapping.Document 3 4@Document 5data class User(@Id var id: Long? = -1, var username: String = "", val age: Int? = 0)

实现User的数据访问对象:UserRepository

1import name.quanke.kotlin.chaper11_6_4.entity.User 2import org.springframework.data.mongodb.repository.MongoRepository 3import org.springframework.stereotype.Repository 4 5/** 6 * Created by http://quanke.name on 2018/1/11. 7 */ 8@Repository 9interface UserRepository : MongoRepository<User, Long> { 10 fun findByUsername(username: String): User 11 12}

通过上面的例子,我们可以轻而易举的对MongoDB进行访问,但是实战中,应用服务器与MongoDB通常不会部署于同一台设备之上,这样就无法使用自动化的本地配置来进行使用。这个时候,我们也可以方便的配置来完成支持,只需要在application.properties中加入mongodb服务端的相关配置,具体示例如下:

参数配置

application.yml文件中增加

1spring: 2 data: 3 mongodb: 4 uri: mongodb://192.168.2.53:27017/test

在尝试此配置时,记得在mongo中对test库创建具备读写权限的用户(用户名为name,密码为pass),不同版本的用户创建语句不同,注意查看文档做好准备工作

若使用mongodb 2.x,也可以通过如下参数配置,该方式不支持mongodb 3.x。

1spring: 2 data: 3 mongodb: 4 host: mongodb:localhost spring.data.mongodb.port=27017

单元测试

1import name.quanke.kotlin.chaper11_6_4.entity.User 2import name.quanke.kotlin.chaper11_6_4.repository.UserRepository 3import org.apache.commons.logging.LogFactory 4import org.junit.Test 5import org.junit.runner.RunWith 6import org.springframework.beans.factory.annotation.Autowired 7import org.springframework.boot.test.context.SpringBootTest 8import org.springframework.test.context.junit4.SpringRunner 9 10 11/** 12 * Created by http://quanke.name on 2018/1/9. 13 */ 14@RunWith(SpringRunner::class) 15@SpringBootTest 16class ApplicationTests { 17 18 val log = LogFactory.getLog(ApplicationTests::class.java)!! 19 20 @Autowired 21 lateinit var userRepository: UserRepository 22 23 @Test 24 fun `redis string test"`() { 25 userRepository.save(User(1L, "quanke", 30)) 26 userRepository.save(User(2L, "quanke.name", 40)) 27 28 log.info("数据总条数:${userRepository.count()}") 29 30 log.info("用户名字为 quanke : ${userRepository.findByUsername("quanke")}") 31 } 32 33}

更多Spring Boot 和 kotlin相关内容

欢迎关注《Spring Boot 与 kotlin 实战》

全科龙婷

参考

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Go语言操作mongoDB

Go语言操作mongoDBmongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。mongoDB介绍mongoDB(https://www.mongodb.com/)是目前比较流行