在Spring Boot中加载初始化数据

简介: 在Spring Boot中加载初始化数据

文章目录



在Spring Boot中加载初始化数据


在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());
    }
相关文章
|
1月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
107 0
|
1月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
60 0
|
1月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
73 0
|
1月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
2月前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
514 43
|
3月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
1214 17
Spring Boot 两种部署到服务器的方式
|
1月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
54 0
|
3月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
104 21
|
11月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。
|
8月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
233 1