SpringBoot集成H2数据库
背景
H2数据库是一个Java编写的关系型数据库,它可以被嵌入到Java应用程序中使用,或者作为一个单独的数据库服务器运行。它支持内存模式,所以在单元测试的时候,使用H2数据库是一个很好的选择。本篇记录了SpringBoot整合H2数据库的简单使用。
添加H2依赖
添加如下maven坐标引入H2数据库:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
添加数据库配置文件
和正常连接数据库一样,需要添加数据库驱动,数据库url,用户名和密码等信息。同时设置一下schema以及data的属性,这边是初始化数据库的结构脚本以及数据脚本:
spring:
datasource:
url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL # mem指定数据库使用内存模式 MODE指定使用MySQL模式
driver-class-name: org.h2.Driver
username: root
password: 123456
schema: classpath:db/schema.sql # 表结构脚本
data: classpath:db/data.sql # 表数据脚本
h2:
console:
enabled: true # 访问h2数据库控制台
schema.sql脚本:
DROP TABLE IF EXISTS `tbl_account`;
CREATE TABLE `tbl_account` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`balance` double NOT NULL,
PRIMARY KEY (`id`)
);
data.sql脚本:
INSERT INTO `tbl_account` (`id`, `name`, `balance`) VALUES (1, 'yuan', 800);
INSERT INTO `tbl_account` (`id`, `name`, `balance`) VALUES (2, 'zhi', 600);
INSERT INTO `tbl_account` (`id`, `name`, `balance`) VALUES (3, 'yang', 750);
这边H2数据库主要用来进行单元测试,所有的文件都存在test目录下:
访问H2数据库控制台
默认H2数据库是不开启的,如果想要访问H2数据库控制台,可以通过添加spring.h2.console.enable=true属性来设置。
同时,如果是使用SpringBootTest注解的话,需要设置一下webEnvironment属性为DEFINED_PORT,使用DEFINED_PORT,Spring会根据server.port配置的端口启动HTTP服务器,如果不指定,默认是8080端口。webEnvironment属性默认使用的是MOCK,MOCK不会创建真实的HTTP服务器,所以要访问控制台的话,需要设置一下webEnvironment属性。
/**
* @author yuanzhihao
* @since 2022/1/27
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@Transactional
public class AccountDaoTest {
}
之后,启动程序。会根据配置文件的信息生成内存数据库,我们可以通过访问https://{ip-address}:{port}/h2-console来访问控制台。
填入用户名和密码,就可以连接到具体的数据库,可以看见创建表的信息:
使用H2数据库进行单元测试
前面说道,使用H2数据库可以用来单元测试,这边业务代码中使用的是mysql数据库,在测试代码中使用H2数据库,可以在不修改真实数据库的情况下进行单元测试,下面就简单贴一下测试代码,具体是对tbl_account表的一些操作:
/**
* @author yuanzhihao
* @since 2022/1/27
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@Transactional
public class AccountDaoTest {
@Autowired
private AccountDao accountDao;
@Test
public void queryList() throws InterruptedException {
List<Account> accountList = accountDao.queryList();
Assert.assertEquals(3, accountList.size());
System.out.println(accountList);
Thread.sleep(3000000);
}
@Test
public void queryById() {
Account account = accountDao.queryById(1);
Assert.assertNotNull(account);
}
@Test
public void insert() {
Account account = new Account();
account.setName("zhi").setBalance(500);
accountDao.insert(account);
}
@Test
public void deleteById() {
accountDao.deleteById(1);
Account account = accountDao.queryById(1);
Assert.assertNull(account);
}
@Test
public void update() {
Account account = accountDao.queryById(1);
account.setBalance(950);
accountDao.update(account);
Account newAccount = accountDao.queryById(1);
Assert.assertEquals(950, newAccount.getBalance(), 0);
}
}
结语
参考地址:https://www.appsdeveloperblog.com/h2-in-memory-database-spring-boot/