在Spring Boot中加載初始化數據java
在Spring Boot中,Spring Boot會自動搜索映射的Entity,而且建立相應的table,可是有時候咱們但願自定義某些內容,這時候咱們就須要使用到data.sql和schema.sql。git
Spring Boot的依賴咱們就不將了,由於本例將會有數據庫的操做,咱們這裏使用H2內存數據庫方便測試:github
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
咱們須要使用JPA來建立Entity:spring
@Entity public class Country { @Id @GeneratedValue(strategy = IDENTITY) private Integer id; @Column(nullable = false) private String name; //... }
咱們這樣定義repository:sql
public interface CountryRepository extends CrudRepository<Country, Integer> { List<Country> findByName(String name); }
若是這時候咱們啓動Spring Boot程序,將會自動建立Country表。shell
上面咱們建立好了數據表格,咱們可使用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條數據,能夠寫個測試例子測試一下:springboot
@RunWith(SpringRunner.class) @SpringBootTest(classes = LoadIniDataApp.class) public class SpringBootInitialLoadIntegrationTest { @Autowired private CountryRepository countryRepository; @Test public void testInitDataForTestClass() { assertEquals(4, countryRepository.count()); } }
有時候咱們須要自定義數據庫的schema,這時候咱們可使用到schema.sql文件。spring-boot
先看一個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 有以下幾個選項:
若是Spring Boot沒有檢測到自定義的schema manager的話,則會自動使用create-drop模式。不然使用none模式。
@Sql 是測試包中的一個註解,能夠顯示的導入要執行的sql文件,它能夠用在class上或者方法之上,以下所示:
@Test @Sql({"classpath:new_country.sql"}) public void testLoadDataForTestCase() { assertEquals(6, countryRepository.count()); }
上面的例子將會顯示的導入classpath中的new_country.sql文件。
@Sql有以下幾個屬性:
@SqlConfig主要用在class級別或者用在@Sql註解的config屬性中:
@Sql(scripts = {"classpath:new_country2.sql"}, config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED))
@SqlConfig有以下幾個屬性:
@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
更多教程請參考 flydean的博客