春に埋め込まれたデータベースの例

このチュートリアルでは、SpringフレームワークでHSQL、H2、Derbyなどの組み込みデータベースエンジンを設定するいくつかの例を紹介します。
使用される技術:
-
Spring 4.1.6.RELEASE
-
jUnit 4.1.2
-
Maven 3
テスト済みの組み込みデータベース:
-
HSQLDB 2.3.2
-
H2 1.4.187
-
ダービー10.11.1.1
組み込みデータベースのコンセプトは、開発フェーズでは軽量で高速で、開始時間が短く、テスト容易性が高く、構成が簡単で、開発者がデータベースにデータソースを構成する方法ではなく、開発に集中できるため、またはわずかなコード行をテストするために重量のあるデータベースを起動する時間を無駄にします。
__P.Sこの組み込みデータベース機能は、Spring 3以降に利用可能です。
1.プロジェクトの依存関係
組み込みデータベースの機能は
spring-mvc`に含まれています。たとえば、HSQL組み込みデータベースを起動するには、 `spring-mvc`と
hsqldb`の両方をインクルードする必要があります。
pom.xml
<properties>
<spring.version>4.1.6.RELEASE</spring.version>
<hsqldb.version>2.3.2</hsqldb.version>
<dbh2.version>1.4.187</dbh2.version>
<derby.version>10.11.1.1</derby.version>
</properties>
<dependencies>
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- HyperSQL DB -->
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>${hsqldb.version}</version>
</dependency>
<!-- H2 DB -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${dbh2.version}</version>
</dependency>
<!-- Derby DB -->
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>${derby.version}</version>
</dependency>
</dependencies>
2. Spring XMLの組み込みデータベース
例:Spring XMLを使用して組み込みデータベースを作成し、いくつかのスクリプトを使用してテーブルを作成し、データを挿入する例。 Springは `id`タグの値を使用してデータベース名を作成します。以下の例では、データベース名は「dataSource」になります。
2.1 HSQLの例。
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location="classpath:db/sql/create-db.sql"/>
<jdbc:script location="classpath:db/sql/insert-data.sql"/>
</jdbc:embedded-database>
2.2 H2の例。
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:db/sql/create-db.sql"/>
<jdbc:script location="classpath:db/sql/insert-data.sql"/>
</jdbc:embedded-database>
2.3 Derbyの例
<jdbc:embedded-database id="dataSource" type="DERBY">
<jdbc:script location="classpath:db/sql/create-db.sql"/>
<jdbc:script location="classpath:db/sql/insert-data.sql"/>
</jdbc:embedded-database>
次の「JDBCドライバ接続」が作成されます。
-
HSQL –
jdbc:hsqldb:mem:dataSource
-
H2 –
jdbc:h2:mem:dataSource
-
DERBY –
jdbc:derby:memory:dataSource
3. Springコードの組み込みデータベース
組み込みデータベースをプログラムで作成する例`EmbeddedDatabaseBuilder.setName()`でデータベース名が定義されていない場合、Springはデフォルトのデータベース名 “testdb”を割り当てます。
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;//...
@Bean
public DataSource dataSource() {
//no need shutdown, EmbeddedDatabaseFactoryBean will take care of this
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder
.setType(EmbeddedDatabaseType.HSQL)//.H2 or .DERBY
.addScript("db/sql/create-db.sql")
.addScript("db/sql/insert-data.sql")
.build();
return db;
}
@ComponentScan({ "com.mkyong" })
@Configuration
public class SpringRootConfig {
@Autowired
DataSource dataSource;
@Bean
public JdbcTemplate getJdbcTemplate() {
return new JdbcTemplate(dataSource);
}
次の「JDBCドライバ接続」が作成されます。
-
HSQL –
jdbc:hsqldb:mem:testdb
-
H2 –
jdbc:h2:mem:testdb
-
DERBY –
jdbc:derby:memory:testdb
ユニットテスト
組み込みデータベースを使用してDAOをテストするための簡単な単体テストの例。
4.1テーブルと挿入データを作成するためのSQLスクリプト。
create-db.sql
CREATE TABLE users ( id INTEGER PRIMARY KEY, name VARCHAR(30), email VARCHAR(50) );
insert-data.sql
INSERT INTO users VALUES (1, 'mkyong', '[email protected]'); INSERT INTO users VALUES (2, 'alex', '[email protected]'); INSERT INTO users VALUES (3, 'joel', '[email protected]');
4.2ユニットH2組み込みデータベースを使って `UserDao`をテストします。
UserDaoTest.java
package com.mkyong.dao;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import com.mkyong.model.User;
public class UserDaoTest {
private EmbeddedDatabase db;
UserDao userDao;
@Before
public void setUp() {
//db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();
db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("db/sql/create-db.sql")
.addScript("db/sql/insert-data.sql")
.build();
}
@Test
public void testFindByname() {
NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(db);
UserDaoImpl userDao = new UserDaoImpl();
userDao.setNamedParameterJdbcTemplate(template);
User user = userDao.findByName("mkyong");
Assert.assertNotNull(user);
Assert.assertEquals(1, user.getId().intValue());
Assert.assertEquals("mkyong", user.getName());
Assert.assertEquals("[email protected]", user.getEmail());
}
@After
public void tearDown() {
db.shutdown();
}
}
完了しました。
5.組み込みデータベースのコンテンツを表示しますか?
埋め込みデータベースにアクセスしたり表示したりするには、特定の「データベースマネージャツール」は、組み込みデータベースを起動した同じSpringコンテナまたはJVMで開始する必要があります。さらに、「データベース・マネージャー・ツール」は組み込みデータベースBeanの後に開始する必要があります。豆のロード順序を識別するためにSpringのログを観察することでこの問題を解決するのが最適です。
“HSQLデータベースマネージャー”は良いツールです。ちょうど同じSpringコンテナで始まります。
@PostConstruct
public void startDBManager() {
//hsqldb
//DatabaseManagerSwing.main(new String[]{ "--url", "jdbc:hsqldb:mem:testdb", "--user", "sa", "--password", "" });
//derby
//DatabaseManagerSwing.main(new String[]{ "--url", "jdbc:derby:memory:testdb", "--user", "", "--password", "" });
//h2
//DatabaseManagerSwing.main(new String[]{ "--url", "jdbc:h2:mem:testdb", "--user", "sa", "--password", "" });
}
または `MethodInvokingBean`を使ったSpring XML
<bean depends-on="dataSource"
class="org.springframework.beans.factory.config.MethodInvokingBean">
<property name="targetClass" value="org.hsqldb.util.DatabaseManagerSwing"/>
<property name="targetMethod" value="main"/>
<property name="arguments">
<list>
<value>--url</value>
<value>jdbc:derby:memory:dataSource</value>
<value>--user</value>
<value>sa</value>
<value>--password</value>
<value></value>
</list>
</property>
</bean>
Figure:HSQLデータベースマネージャツール。組み込みデータベースにアクセスする.

6.接続プール
dbcp接続プールを接続する例
<!-- jdbc:hsqldb:mem:dataSource -->
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location="classpath:db/sql/create-db.sql"/>
<jdbc:script location="classpath:db/sql/insert-data.sql"/>
</jdbc:embedded-database>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" >
<constructor-arg ref="dbcpDataSource"/>
</bean>
<bean id="dbcpDataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:dataSource"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
ソースコードをダウンロードする
Github –
spring-embedded-database.git
参考文献
組み込みデータベースのサポート]。リンク://spring/spring-methodinvokingfactorybean-example/[Spring
MethodInvokingFactoryBeanの例]。リンク://spring/spring-view-content-of-hsqldb-embedded-database/[Spring
リンク://タグ/derby/[derby]リンク://タグ/h2/[h2]リンク://タグ/hsqldb/[hsqldb]
spring
spring
埋め込みデータベース