Spring3新功能之一是可以建立內嵌資料庫,便於開發者測試所用,目前支援HSQL、H2和Apache的Derby,預設是HSQL。習於Maven的我,至少要在pom.xml加入這個dependency吧!

<dependency>
    <groupId>hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>1.8.0.7</version>
</dependency>

  Spring3的官方文件有講可以這麼做,其applicationContext.xml如下:

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

  而Java code可以這麼做:

EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.H2).
    addScript("my-schema.sql").addScript("my-test-data.sql").build();
db.shutdown();

  可是一來我討厭配置config檔,因為官方文件的xml只列部份,不讓我copy,<jdbc:embedded>標籤是不是要引入什麼DTD或Schema不得而知,二來官方文件寫,Embedded Database也有預設使用方式,所以就踹它原汁原味的部份。

  幾經失敗,終知道怎麼料理了。因為是用JUnit測試,是故要在Maven預設目錄的/src/test/resources下放兩個SQL Script檔,檔名預設為schema.sql和data.sql,望名生義即知前者在create data,後者增改刪。是故找到HSQL的語法如下:

schema.sql內容:
CREATE MEMORY TABLE FOO(ID INTEGER NOT NULL PRIMARY KEY, NAME VARCHAR(25))
data.sql內容:
INSERT INTO FOO VALUES(1, 'Jemmy')

  如此一來,EmbeddedDatabaseBuilder在預設情況下會找到它們當作預設的HSQL用的Script來建資料,是故在JUnit source code如下:

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;

public class TestEmbedDB {
    private EmbeddedDatabase db;
    @Before
    public void setUp() {
        db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();
    }
    @Test
    public void testDataAccess() {
        JdbcTemplate template = new JdbcTemplate(db);
        int count = template.queryForInt("select count(*) from foo");
        System.out.println(count);
    }
    @After
    public void tearDown() {
        db.shutdown();
    }
}

  如此完全零配置,EmbeddedDatabase被build出來後,可以當作JdbcTemplate的建構子,這樣要玩JDBC、DAO就方便多了。預設建立的JDBC URL是jdbc:hsqldb:mem:testdb,也就是DB Name是testdb,而mem則表示為記憶體(內存)資料庫。

arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()