在SpringBoot中怎么加载初始化数据
创始人
2024-12-25 06:02:14
0次

依赖条件

Spring Boot的依赖我们就不将了,因为本例将会有数据库的操作,我们这里使用H2内存数据库方便测试:

     com.h3database      h3      runtime    

我们需要使用JPA来创建Entity:

@Entitypublic class Country {   @Id  @GeneratedValue(strategy = IDENTITY)  private Integer id;     @Column(nullable = false)  private String name;   //...}

我们这样定义repository:

public interface CountryRepository extends CrudRepository {  List 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());  }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...