在Spring Boot中加载初始化数据的实现
作者:flydean 发布时间:2023-08-18 10:01:44
在Spring Boot中,Spring Boot会自动搜索映射的Entity,并且创建相应的table,但是有时候我们希望自定义某些内容,这时候我们就需要使用到data.sql和schema.sql。
依赖条件
Spring Boot的依赖我们就不将了,因为本例将会有数据库的操作,我们这里使用H2内存数据库方便测试:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
我们需要使用JPA来创建Entity:
@Entity
public class Country {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
@Column(nullable = false)
private String name;
//...
}
我们这样定义repository:
public interface CountryRepository extends CrudRepository<Country, Integer> {
List<Country> findByName(String name);
}
如果这时候我们启动Spring Boot程序,将会自动创建Country表。
data.sql文件
上面我们创建好了数据表格,我们可以使用data.sql来加载文件:
INSERT INTO country (name) VALUES ('India');
INSERT INTO country (name) VALUES ('Brazil');
INSERT INTO country (name) VALUES ('USA');
INSERT INTO country (name) VALUES ('Italy');
在data.sql文件中我们插入了4条数据,可以写个测试例子测试一下:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LoadIniDataApp.class)
public class SpringBootInitialLoadIntegrationTest {
@Autowired
private CountryRepository countryRepository;
@Test
public void testInitDataForTestClass() {
assertEquals(4, countryRepository.count());
}
}
schema.sql 文件
有时候我们需要自定义数据库的schema,这时候我们可以使用到schema.sql文件。
先看一个schema.sql的例子:
CREATE TABLE country (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(128) NOT NULL,
PRIMARY KEY (id)
);
Spring Boot会自动加载这个schema文件。
我们需要关闭spring boot的schema自动创建功能以防冲突:
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.ddl-auto 有如下几个选项:
create : 首先drop现有的tables,然后创建新的tables
update : 这个模式不会删除现有的tables,它会比较现有的tables和新的注解或者xml配置是否一致,然后更新。
create-drop : 和create很类似,不同的是会在程序运行完毕后自动drop掉tables。通常用在单元测试中。
validate : 只会做table是否存在的验证,不存在则会报错。
none : 关闭ddl自动生成功能。
如果Spring Boot没有检测到自定义的schema manager的话,则会自动使用create-drop模式。否则使用none模式。
@sql注解
@Sql 是测试包中的一个注解,可以显示的导入要执行的sql文件,它可以用在class上或者方法之上,如下所示:
@Test
@Sql({"classpath:new_country.sql"})
public void testLoadDataForTestCase() {
assertEquals(6, countryRepository.count());
}
上面的例子将会显示的导入classpath中的new_country.sql文件。
@Sql有如下几个属性:
config : 用来配置SQL脚本,我们在下面的@SqlConfig详细讲解。
executionPhase : 可以选择脚本是在BEFORE_TEST_METHOD 或者 AFTER_TEST_METHOD来执行。
statements: 可以接受内联的sql语句
scripts: 可以指明要执行脚本的路径
@SqlConfig 注解
@SqlConfig主要用在class级别或者用在@Sql注解的config属性中:
@Sql(scripts = {"classpath:new_country2.sql"},
config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED))
@SqlConfig有如下几个属性:
blockCommentStartDelimiter: 指明了SQL脚本的开始标记。
blockCommentEndDelimiter: SQL脚本的结束标记。
commentPrefix: SQL 脚本的注释标记
dataSource : javax.sql.DataSource的名字,指定该脚本将会在什么datasource下执行
encoding: SQL 文件的编码
errorMode: 脚本遇到错误的处理模式
separator: 分隔符
transactionManager: 指定的PlatformTransactionManager
transactionMode: 事务模式
@Sql是可以多个同时使用的,如下所示:
@Test
@Sql({"classpath:new_country.sql"})
@Sql(scripts = {"classpath:new_country2.sql"},
config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED))
public void testLoadDataForTestCase() {
assertEquals(6, countryRepository.count());
}
本文的例子可以参考 : https://github.com/ddean2009/learn-springboot2/tree/master/springboot-load-ini-data
来源:https://segmentfault.com/a/1190000021728771
猜你喜欢
- 简介:本文将帮助您使用 Spring Boot 创建简单的 REST 服务。你将学习什么是 REST 服务?如何使用 Spring Init
- 资源服务器就是业务服务 如用户服务,订单服务等 第三方需要到资源服务器调用接口获取资源ResourceServerConfigResourc
- 问题:为什么有缓存mybatis默认开启一级缓存什么场景下必须需要关闭一级缓存场景:执行2次相同sql,但是第一次查询sql结果会加工处理,
- 属性问题引入前面我们已经在父工程中的dependencyManagement标签中对项目中所使用的jar包版本进行了统一的管理,但是如果在标
- redis redisson 集合操作相关类及接口Rlist:链表public interface RList<V> exten
- 一、实现原理使用MockMvc发起请求,然后执行API中相应的代码,在执行的过程中使mock模拟底层数据的返回,最后结果验证。二、常用注解介
- 部署到webapps目录启动本文使用的Spring版本为Spring6,SpringBoot版本为3,JDK为17,可能会和之前有细微不同,
- 基于 springboot+vue的测试平台开发一、前端环境搭建在前端框架vue-element-admin这个项目中,有一个简洁轻量型的项
- springBoot项目启动多个实例今天碰到一个需求是,将一个服务提供者启动两个实例,一个实例对外,一个实例对内,对内价格有折扣,两个实例通
- Java泛型是JDK 5引入的一个特性,它允许我们定义类和接口的时候使用参数类型,泛型在集合框架中被广泛使用。类型擦除是泛型中最让人困惑的部
- 简介说明本文介绍Spring如何控制Bean注入的顺序。首先需要说明的是:在Bean上加@Order(xxx)是无法控制bean注入的顺序的
- 本篇将从以下几个方面讲述反射的知识:class 的使用方法的反射构造函数的反射成员变量的反射一、什么是class类在面向对象的世界里,万物皆
- 一、背景假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。因此我们就需要找到一种方法来解决这个问题。二、解决
- 这是一个及其常见的问题,网上已经有关于这个问题的很多讨论。但是我觉得都是不求甚解,有一些还是在误导别人。下面我来说下我对这三者的理解,如有错
- 定义jdk8发布新特性中,lambda是一大亮点之一。lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率。Lam
- 一、前言 本学期学习了JAVA语言,在学期的结束,写一个有操作界面,与数据库关联的管理系统,用来巩固自己本学习所学的知识。 用到的知识:JA
- MyBatis添加记录后获取主键ID,这是一个很常见的需求。这个需求有分为两种情况:(1)添加单条记录时获取主键值;(2)获取批量添加记录时
- 前言MyBatis常用标签及标签使用技巧MyBatis的常用标签有很多,比如<sql id="">:预定义可
- 可变数目参数的好处就是在某些情况下可以方便地对参数个数不确定情况的实现,例如计算任意数字的加权和,链接任意字符串为一个字符串等。看下例子:p
- 核心配置文件mybatis-config.xml 系统核心配置文件MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属