Spring嵌入式数据库示例

hsql数据库管理器工具

在本教程中,我们将向您展示一些示例,以在Spring框架中配置嵌入式数据库引擎,例如HSQL,H2和Derby。

使用的技术:

  1. 春天4.1.6.RELEASE
  2. jUnit 4.1.2
  3. Maven 3

嵌入式数据库经过测试:

  1. HSQLDB 2.3.2
  2. 氢气1.4.187
  3. 德比10.11.1.1

嵌入式数据库的概念在开发阶段非常有用,因为它们轻巧,快速,启动时间短,可测试性强,易于配置,它使开发人员可以将更多精力放在开发上,而不是如何为数据库配置数据源,或浪费时间来启动重量级的数据库,仅测试几行代码。

PS此嵌入式数据库功能自Spring 3起可用。

1.项目依赖

嵌入式数据库功能包含在spring-mvc 。 例如,要启动HSQL嵌入式数据库,需要同时包含spring-mvchsqldb

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驱动程序连接”:

  1. HSQL – jdbc:hsqldb:mem:dataSource
  2. H2 – jdbc:h2:mem:dataSource
  3. 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驱动程序连接”:

  1. HSQL – jdbc:hsqldb:mem:testdb
  2. H2 – jdbc:h2:mem:testdb
  3. DERBY – jdbc:derby:memory:testdb

4.单元测试

一个简单的单元测试示例,用于测试具有嵌入式数据库的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', 'mkyong@gmail.com');
INSERT INTO users VALUES (2, 'alex', 'alex@yahoo.com');
INSERT INTO users VALUES (3, 'joel', 'joel@gmail.com');

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("mkyong@gmail.com", user.getEmail());

    }

    @After
    public void tearDown() {
        db.shutdown();
    }

}

做完了

5.查看嵌入式数据库的内容?

为了访问或查看嵌入式数据库,特定的“数据库管理器工具”必须以启动嵌入式数据库的相同Spring容器或JVM启动。 此外,“数据库管理器工具”必须在嵌入式数据库Bean之后启动,最好通过观察Spring的日志以识别Bean的加载顺序来解决。

“ 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>

图:HSQL数据库管理器工具,访问嵌入式数据库。

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

参考文献

  1. JDBC嵌入式数据库支持
  2. Spring MethodInvokingFactoryBean示例
  3. Spring–查看HSQLDB嵌入式数据库的内容

翻译自: https://mkyong.com/spring/spring-embedded-database-examples/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值