SpringBoot集成H2数据库

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目录下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQ2pOkBD-1644409005012)(/Users/yuanzhihao/Library/Application Support/typora-user-images/image-20220209192414662.png)]

访问H2数据库控制台

默认H2数据库是不开启的,如果想要访问H2数据库控制台,可以通过添加spring.h2.console.enable=true属性来设置。

同时,如果是使用SpringBootTest注解的话,需要设置一下webEnvironment属性为DEFINED_PORT,使用DEFINED_PORT,Spring会根据server.port配置的端口启动HTTP服务器,如果不指定,默认是8080端口。webEnvironment属性默认使用的是MOCK,MOCK不会创建真实的HTTP服务器,所以要访问控制台的话,需要设置一下webEnvironment属性。

具体差异参考:https://stackoverflow.com/questions/58364490/difference-between-webenvironment-random-port-and-webenvironment-mock

/**
 * @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来访问控制台。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PBSWUTm0-1644409005019)(/Users/yuanzhihao/Library/Application Support/typora-user-images/image-20220209201013491.png)]
填入用户名和密码,就可以连接到具体的数据库,可以看见创建表的信息:
在这里插入图片描述

使用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/

https://zhuanlan.zhihu.com/p/141667149

代码地址:https://github.com/yzh19961031/SpringCloudDemo

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值