H2数据库在单元测试中的应用

H2数据库特征

用比较简洁的话来介绍h2数据库,就是一款轻量级的内存数据库,支持标准的SQL语法和JDBC API,工业领域中,一般会使用h2来进行单元测试。

这里贴一下h2数据库的主要特征

  • Very fast database engine
  • Open source
  • Written in Java
  • Supports standard SQL, JDBC API
  • Embedded and Server mode, Clustering support
  • Strong security features
  • The PostgreSQL ODBC driver can be used
  • Multi version concurrency

还有一些附加的特征,也列一下

  • Disk based or in-memory databases and tables, read-only database support, temporary tables
  • Transaction support (read uncommitted, read committed, repeatable read, snapshot), 2-phase-commit
  • Multiple connections, row-level locking
  • Cost based optimizer, using a genetic algorithm for complex queries, zero-administration
  • Scrollable and updatable result set support, large result set, external result sorting, functions can return a result set
  • Encrypted database (AES), SHA-256 password encryption, encryption functions, SSL

H2数据库的两种连接模式

内嵌模式 Embedded Mode

在内嵌模式中,h2数据库和应用程序是在一个JVM进程中,这种模式的优点就是速度极快,缺点也是显而易见的,因为和应用程序在同一个进程中,是会共享内存、CPU、线程等资源的,如果共享资源没有协调好,很有可能就会造成数据库不可用甚至崩溃。

服务器模式 Server Mode

在服务器模式中,应用程序是通过JDBC的方式连接h2数据库,相比内嵌方式,这种模式的速率会有所降低,因为有数据传输的损耗。

可能还会有一些资料介绍说有第三种混合模式,第三种混合模式是针对两个应用来说的,第一个应用使用内嵌的方式连接h2数据库,另外一个应用通过服务器模式连接h2数据库,其实本质还是这两种模式。

H2数据库集成springboot

pom依赖

XML 复制代码
<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <version>2.2.220</version>
</dependency>

配置文件

XML 复制代码
server:
  port: 9090

mybatis:
  type-aliases-package: com.tml.mouseDemo.model
  mapper-locations: classpath:mapper/*.xml


spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:db_users;MODE=MYSQL;INIT=RUNSCRIPT FROM 'classpath:init_table.sql'
    username: tml
    password: helloTml
  h2:
    console:
      enabled: true

在单元测试中,一般都是使用内嵌内存模式,内存模式不会造成数据的污染,因为数据会随着程序的结束而销毁

这里的init_table.sql是H2的初始化脚本,可以初始化单元测试用例需要的用例数据,也贴一下文本

sql 复制代码
create table  t_user
(id int not null primary key auto_increment,user_name varchar(100),password varchar(100),status int,create_time datetime);


insert into t_user (user_name,password,status,create_time) values ('tml','hello world',1,now());

初始化脚本init_table.sql和配置文件application.yml的层级关系如下图

mapper接口

java 复制代码
package com.tml.mouseDemo.mapper;

import com.tml.mouseDemo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserMapper {

    List<User> listByName(@Param("userName") String userName);

    User getOneUser(@Param("uid") Long uid);

}

实体类

java 复制代码
package com.tml.mouseDemo.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    private static final long serialVersionUID = -4489033966046239802L;

    private Long id;

    private String userName;

    private String password;

    private Integer status;

    private Date createTime;

}

Mapper XML File

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tml.mouseDemo.mapper.UserMapper">


    <resultMap id="BaseResultMap" type="com.tml.mouseDemo.model.User">

        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="user_name" jdbcType="VARCHAR" property="userName"/>
        <result column="password" jdbcType="VARCHAR" property="password"/>
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
        <result column="status" jdbcType="INTEGER" property="status"/>
    </resultMap>


    <select id="listByName" resultMap="BaseResultMap">
        SELECT *
        FROM `t_user` t
        WHERE t.`user_name` = #{userName}
    </select>


    <select id="getOneUser" resultMap="BaseResultMap">
        SELECT *
        FROM `t_user` t
        WHERE t.`id` = #{uid}
    </select>

</mapper>

至此,一个简单的springboot项目集成h2数据库就完成了。

利用h2进行单元测试

一个基于init_table.sql中的初始化数据的断言测试用例如下

java 复制代码
package com.tml.mouseDemo;

import com.tml.mouseDemo.mapper.UserMapper;
import com.tml.mouseDemo.model.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class MouseDemoApplicationTests {


    @Autowired
    private UserMapper userMapper;


    @Test
    public void testH2() {
        List<User> users = userMapper.listByName("tml");
        Assert.assertEquals(1, users.size());
    }


}

H2数据库控制台

当java进程在运行中的时候,并且程序是开启了h2数据库的控制台 【spring.h2.console.enabled=true】,此时是可以直接通过http://localhost:9090/h2-console访问控制台,端口是内嵌java应用的端口号,登录时需要用账号密码,账号密码就是配置文件application.yml中的username、password,效果图如下

总结

h2数据库的基本用法就是这样,大家可以根据h2数据库自身的特点尽情发挥,详情可以参考官网https://www.h2database.com/html/features.html

切记,不要在生产环境轻易使用h2数据库

相关推荐
曹牧2 分钟前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星22 分钟前
MySQL count()函数的用法
数据库·mysql
末央&30 分钟前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花34 分钟前
数据库知识复习07
数据库·作业
素玥1 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian1 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室1 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善2 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅2 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师2 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql