文档章节

Spring boot 初始化数据库

郁也风
 郁也风
发布于 2018/09/05 17:05
字数 466
阅读 895
收藏 0

缘起

最近在用 spring boot 搞单元测试时候需要在测试初始时重建数据库表结构以及载入一些测试数据,本来打算自己写个初始化 SQL 的方法,结果发现 spring boot 自身已经提供了此功能。

实现

具体实现可参考 org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer,里面有两个方法 createSchemainitSchema

前者可以用来执行 ddl 脚本重建数据库表结构,后者可以用来初始化一些测试数据,其实二者的实现是基本一样的,这点区别算是语义上的。

随便贴点源码基本就明白了:

	public boolean createSchema() {
		List<Resource> scripts = getScripts("spring.datasource.schema",
				this.properties.getSchema(), "schema");
		if (!scripts.isEmpty()) {
			if (!isEnabled()) {
				logger.debug("Initialization disabled (not running DDL scripts)");
				return false;
			}
			String username = this.properties.getSchemaUsername();
			String password = this.properties.getSchemaPassword();
			runScripts(scripts, username, password);
		}
		return !scripts.isEmpty();
	}

原理很简单,在配置文件中配置 schemadata 指向相应的 SQL 文件即可,例如 application.yml

spring:
    profiles:
        active: test

    output.ansi.enabled: ALWAYS

    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/xxx
        username: root
        password: root

        initialization-mode: always
        schema:
            - classpath*:table-drop-ddl.sql
            - classpath*:table-create-ddl.sql

重点是下面几行,initialization-mode 参见 org.springframework.boot.jdbc.DataSourceInitializationMode,因为用了第三方连接池,所以这儿需要使用 always

schema 则是指向的初始化 SQL 脚本位置,我这儿是分为两个,一个用来删除表,一个用来创建表。

如果需要初始化数据,则可以使用 data,具体模式与 schema 一致。

额外

如果想要在输出中查看此操作的详细日志,可以类似如下配置:

<logger name="org.springframework.jdbc.datasource.init" level="DEBUG"/>

Over

© 著作权归作者所有

郁也风
粉丝 16
博文 31
码字总数 17009
作品 0
长宁
项目经理
私信 提问
给spring-boot测试提供unitils支持的开源项目

一、unitils测试框架优缺点介绍 在unitils的支持下,xml配置的spring项目在测试时,有如下好处: 1、利用注解@DataSet、@ExpectedDataSet来准备数据和校验结果数据,每次运行测试用例不用重新...

yangjianzhou
2018/07/09
548
1
Spring Boot对内嵌数据库的支持

开发应用时使用内存数据库是很实用的。很方便的一点是,内存数据库不需要提供持久化存储。 你不需要在应用启动时做初始化数据库动作, 也不需要在应用结束时去删除数据。 Spring Boot可以自动...

xiaolyuh
09/21
28
0
springboot微服务系列教程

微服务系列教程 Spring Boot 2是微服务的基础,在2018年3月初,Spring Boot 正式宣布进入2.0时代。下面一起来步入Spring Boot 2时代,领略Spring Boot 2带来的开发乐趣吧! 本系统源代码地址...

鱼煎
01/13
392
0
Spring Boot 整合MyBatis

通过一个小例子来实现Spring Boot 与MyBatis的整合。 加入maven依赖 Spring Boot官方提供的starter是这样的:spring-boot-starter-而其他第三方提供的starter是这样的:-spring-boot-starte...

流小文
2017/04/17
302
0
Spring Boot魔法的背后

Spring Boot的魔法 Spring Boot是一个基于Spring的框架,遵循“约定胜于配置”的理念,提供一套方便的方法来快速创建可执行的Spring应用。具体来说,以往我们开发一个Java Web端或服务端程序...

jacobwu
2018/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Phpstorm2018 永久激活

1、安装phpstorm,安装包请自行官网下载 http://www.jetbrains.com/phpstorm/download/ 2、下载JetbrainsCrack.jar文件,存放至你的phpstorm执行文件同级目录下 下载JetbrainsCrack.jar 提取...

happyfish319
23分钟前
5
0
谈一谈Android进程间通信的几种方式

###来看一下Android中除了AIDL还有哪些进程间通信的方式: 1、Bundle Bundle实现了Parcelable,所以在Android中我们可以通过Intent在不同进程间传递Bundle数据。 但是在Intent 传输数据的过程...

二营长的意大利炮手
24分钟前
7
0
互联网薪资“高开低走”,你的能力是否真的可以匹配高薪?

对于国内外主流互联网大厂,技术出身似乎已经成为各大掌门人的必备标签。谷歌 CEO 桑达尔·皮查伊、马克·扎克伯格、李彦宏、马化腾、雷军等等皆为技术人出身,都曾参与了公司内部重要产品的...

Java技术剑
25分钟前
8
0
java 多线程

线程声明周期 线程的五个状态:新建,就绪,运行,阻塞,死亡。 其中就绪和运行两个状态客户互相转换,但运行到阻塞,阻塞到就绪,只能单向转换。 刚new出的线程就是【新建】状态,调用start...

雷开你的门
27分钟前
10
0
构造器Constructor是否可被overrid

构造器不能被重写,不能用static修饰构造器,只能用public private protected这三个权限修饰符,且不能有返回语句。

无名氏的程序员
31分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部