前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL

Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL

作者头像
全科
发布于 2018-08-15 03:16:48
发布于 2018-08-15 03:16:48
1.6K00
代码可运行
举报
文章被收录于专栏:全栈架构全栈架构
运行总次数:0
代码可运行

之前介绍了一些Web层的例子,包括构建RESTful API、使用Thymeleaf模板引擎渲染Web视图,但是这些内容还不足以构建一个动态的应用。通常我们做App也好,做Web应用也好,都需要内容,而内容通常存储于各种类型的数据库,服务端在接收到访问请求之后需要访问数据库获取并处理成展现给用户使用的数据形式。

本文介绍在Spring Boot基础下配置数据源和通过 JdbcTemplate编写数据访问的示例。

数据源配置

在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式。

首先,为了连接数据库需要引入jdbc支持,在 build.gradle中引入如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile "org.springframework.boot:spring-boot-starter-jdbc:$spring_boot_version"

连接数据源

MySQL数据库为例,先引入MySQL连接的依赖包,在 build.gradle中加入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compile "mysql:mysql-connector-java:$mysql_version"

完整 build.gradle

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
group 'name.quanke.kotlin'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.10'
    ext.spring_boot_version = '1.5.4.RELEASE'
    ext.springfox_swagger2_version = '2.7.0'
    ext.mysql_version = '5.1.21'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version")

//        Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置open类插件
        classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version")
        classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
    }
}

apply plugin: 'kotlin'
apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'chapter11-6-1-service'
    version = '0.1.0'
}
repositories {
    mavenCentral()
}


dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "org.springframework.boot:spring-boot-starter-web:$spring_boot_version"
    compile "org.springframework.boot:spring-boot-starter-jdbc:$spring_boot_version"
    compile "mysql:mysql-connector-java:$mysql_version"
    testCompile "org.springframework.boot:spring-boot-starter-test:$spring_boot_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"

}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

src/main/resources/application.yml中配置数据源信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

连接JNDI数据源

当你将应用部署于应用服务器上的时候想让数据源由应用服务器管理,那么可以使用如下配置方式引入JNDI数据源。

如果对JNDI不是很了解的,请参考 https://baike.baidu.com/item/JNDI/3792442?fr=aladdin

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.datasource.jndi-name=java:jboss/datasources/customers

使用JdbcTemplate操作数据库

Spring的 JdbcTemplate是自动配置的,你可以直接使用 @Autowired来注入到你自己的bean中来使用。

举例:我们在创建 User表,包含属性id,name、age,下面来编写数据访问对象和单元测试用例。

定义包含有插入、删除、查询的抽象接口UserService

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface UserService {

    /**
     * 获取用户总量
     */
    val allUsers: Int?

    /**
     * 新增一个用户
     * @param name
     * @param age
     */
    fun create(name: String, password: String?)

    /**
     * 根据name删除一个用户高
     * @param name
     */
    fun deleteByName(name: String)

    /**
     * 删除所有用户
     */
    fun deleteAllUsers()

}

通过 JdbcTemplate实现 UserService中定义的数据访问操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Service
/**
 * Created by http://quanke.name on 2018/1/10.
 */
@Service
class UserServiceImpl : UserService {

    @Autowired
    private val jdbcTemplate: JdbcTemplate? = null

    override val allUsers: Int?
        get() = jdbcTemplate!!.queryForObject("select count(1) from USER", Int::class.java)

    override fun create(name: String, password: String?) {
        jdbcTemplate!!.update("insert into USER(USERNAME, PASSWORD) values(?, ?)", name, password)
    }

    override fun deleteByName(name: String) {
        jdbcTemplate!!.update("delete from USER where USERNAME = ?", name)
    }

    override fun deleteAllUsers() {
        jdbcTemplate!!.update("delete from USER")
    }
}

创建对UserService的单元测试用例,通过创建、删除和查询来验证数据库操作的正确性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Created by http://quanke.name on 2018/1/9.
 */
@RunWith(SpringRunner::class)
@SpringBootTest
class ApplicationTests {

    val log = LogFactory.getLog(ApplicationTests::class.java)!!

    @Autowired
    lateinit var userService: UserService

    @Test
    fun `jdbc test"`() {

        val username = "quanke"
        val password = "123456"
        // 插入5个用户
        userService.create("$username a", "$password 1")
        userService.create("$username b", "$password 2")
        userService.create("$username c", "$password 3")
        userService.create("$username d", "$password 4")
        userService.create("$username e", "$password 5")


        log.info("总共用户 ${userService.allUsers}")

        // 删除两个用户
        userService.deleteByName("$username a")
        userService.deleteByName("$username b")

        log.info("总共用户 ${userService.allUsers}")
    }

}

上面介绍的JdbcTemplate只是最基本的几个操作,更多其他数据访问操作的使用请参考:JdbcTemplate API

通过上面这个简单的例子,我们可以看到在Spring Boot下访问数据库的配置依然秉承了框架的初衷:简单。我们只需要在pom.xml中加入数据库依赖,再到application.yml中配置连接信息,不需要像Spring应用中创建JdbcTemplate的Bean,就可以直接在自己的对象中注入使用。

更多Spring Boot 和 kotlin相关内容,欢迎关注《Spring Boot 与 kotlin 实战》

参考

  • https://spring.io/guides/gs/relational-data-access/
  • http://blog.didispace.com/springbootdata1/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
redis面试总结
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
三哥
2018/08/20
8750
面试总结-链接
https://blog.csdn.net/CCUTwangning/article/details/70153589 天下无难试之Redis面试题刁难大全 https://blog.csdn.net/g0_hw/article/details/79360073
小二三不乌
2018/08/02
3070
redis和memcached的优缺点及区别
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
黄啊码
2020/05/29
1.6K0
如何保证redis里都是热点数据呢&&Memcache与Redis的区别
redis 提供 6种数据淘汰策略: 大体上:是可以从设置过期时间数组集里挑选最少使用的或者将要过期的或者任意数据淘汰,也可以禁止淘汰 具体的:
名字是乱打的
2021/12/22
5440
如何保证redis里都是热点数据呢&&Memcache与Redis的区别
Redis面试题(一): Redis到底是多线程还是单线程?
Q: 那这样子,在读取socket1的数据时,如果其它socket有数据来,那么也要等到socket1读取完了才能继续读取其它socket的数据吧。那不是也阻塞住了吗?而且读取到的数据也要开启线程处理吧,那这和多线程IO有什么区别呢? A: 1.CPU本来就是线性的不论什么都需要顺序处理并行只能是多核CPU 2.io多路复用本来就是用来解决对多个I/O监听时,一个I/O阻塞影响其他I/O的问题,跟多线程没关系. 3.跟多线程相比较,线程切换需要切换到内核进行线程切换,需要消耗时间和资源.而I/O多路复用不需要切换线/进程,效率相对较高,特别是对高并发的应用nginx就是用I/O多路复用,故而性能极佳.但多线程编程逻辑和处理上比I/O多路复用简单.而I/O多路复用处理起来较为复杂.
全栈程序员站长
2022/08/18
4580
Redis面试题(一): Redis到底是多线程还是单线程?
Redis的基础介绍与安装使用步骤
Redis的基础介绍与安装使用步骤:https://www.jianshu.com/p/2a23257af57b Redis的基础数据结构与使用:https://www.jianshu.com/p/c95c8450c5b6 Redis核心原理:https://www.jianshu.com/p/4e6b7809e10a Redis 5 之后版本的高可用集群搭建:https://www.jianshu.com/p/8045b92fafb2 Redis 5 版本的高可用集群的水平扩展:https://www.jianshu.com/p/6355d0827aea Redis 5 集群选举原理分析:https://www.jianshu.com/p/e6894713a6d5 Redis 5 通信协议解析以及手写一个Jedis客户端:https://www.jianshu.com/p/575544f68615
zoro
2019/04/11
7080
Redis的基础介绍与安装使用步骤
常见的Redis面试题及分布式集群讲解
作者:蘑菇先生 出处:http://www.cnblogs.com/mushroom/ 1. 使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,sorted set,hash (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
Tanyboye
2018/07/02
2K0
redis面试题
1、Redis的特点? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。
用户9131103
2023/07/17
1340
【162期】一些Redis面试题及分布式集群面试考点整理
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
良月柒
2021/03/26
5800
Redis和Memcache区别,优缺点对比
个人总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的key/value存储,选择memcache。
Cheng_Blog
2022/02/25
3.9K0
《redis 设计与实现》--总结
Redis自己构建了简单动态字符串(Simple Dynamic String,SDS)来作为默认的字符串表示。 SDS的构造如下:
小二三不乌
2018/08/07
8460
《redis 设计与实现》--总结
redis组件
redis-server:服务器端工具 redis-cli:客户端工具 redis-benchmark:redis性能压力测试工具 redis-check-dump(rdb格式) & redis-check-aof(aof格式):检测持久化存储RDB/AOF的文件格式是否错误,以及发现错误进行修复 redis-shutdown:用于关闭redis redis-sentinel:用于实现redis主从切换的工具 ```
玖柒的小窝
2021/09/19
3750
非常值得一看的35个Redis面试题总结(一)
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
互扯程序
2019/07/10
9470
Redis详解 单线程 基于内存设计 主从 持久化 与 memcached区别 及常见问题
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
大鹅
2021/06/16
5250
Redis最常见面试问题
来 源:cnblogs.com/Survivalist/p/8119891.html
JavaFish
2019/11/01
4220
网络上收集的有关 Redis 方面的面试题
假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来 使用keys指令可以扫出指定模式的key列表 ### 对应的问题 因为redis 是单线程 所以一次性操作大量的数据 可能会导致业务出现卡顿 ### 解决办法 这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长. Redis有哪些数据结构? 字符串String、字典H
风清醉
2019/12/18
4800
Redis面试题总结
参考 https://blog.csdn.net/zdp072/article/details/50991116 https://blog.csdn.net/qq_34337272/article/details/80012284#commentBox
凯哥Java
2022/12/16
3170
Redis面试题总结
从阿里、腾讯的面试真题中总结了这11个Redis高频面试题
现在大家的工作生活基本已经是回归正轨了,最近也是迎来了跳槽面试季,有些人已经拿到了一两个offer了。
程序员追风
2020/04/02
7670
从阿里、腾讯的面试真题中总结了这11个Redis高频面试题
2021最新版 史上最全的50个Redis面试题(含答案)
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
猫头虎
2024/04/07
2350
2021最新版 史上最全的50个Redis面试题(含答案)
值得一看的35个Redis面试题总结
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
民工哥
2020/09/16
8140
相关推荐
redis面试总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验