当前位置: 首页 > article >正文

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依赖

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <version>2.2.220</version>
</dependency>

配置文件

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的初始化脚本,可以初始化单元测试用例需要的用例数据,也贴一下文本

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接口

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);

}

实体类

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 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中的初始化数据的断言测试用例如下

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数据库


http://www.kler.cn/a/473034.html

相关文章:

  • IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡
  • linux音视频采集技术: v4l2
  • 33.3K 的Freqtrade:开启加密货币自动化交易之旅
  • STM32——系统滴答定时器(SysTick寄存器详解)
  • Keepalived 进阶秘籍:全方位配置优化
  • asammdf python库解析MF4文件(一)cut and filter
  • 实时数仓:Apache Iceberg 的表管理与实时数仓架构设计
  • [读书日志]从零开始学习Chisel 第八篇:Scala的集合(敏捷硬件开发语言Chisel与数字系统设计)
  • MySQL error [Warning] InnoDB: Table mysql/innodb_index_stats has length
  • win32汇编环境,怎么进行乘法运算的
  • (一)使用 WebGL 绘制一个简单的点和原理解析
  • 《计算机视觉解锁图像理解密码:编程实现图片场景文字描述生成》
  • Ungoogled Chromium127 编译指南 MacOS篇(七)- 安装依赖包
  • 【郑大主办、ACM出版、EI稳定检索】第四届密码学、网络安全与通信技术国际会议 (CNSCT 2025)
  • 瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp)
  • spring cloud alibaba-dubbo3 rpc运行原理
  • 最新版Edge浏览器加载ActiveX控件之Adobe PDF阅读器控件
  • 【MySQL高可用】什么时候分库、分表?怎样进行分库分表?
  • 网络安全 | 网络安全的未来趋势
  • 数智大咖谈 | 志邦家居:智慧家居与智慧管理并驾齐驱
  • select下拉框,首次进入页面没有显示value的情况
  • 如何构建多层决策树
  • c#编写基于ffmpeg的视频裁剪
  • 【VBA】【EXCEL】将某列内容横向粘贴到指定行
  • 点击底部的 tabBar 属于 wx.switchTab 跳转方式,目标页面的 onLoad 不会触发(除非是第一次加载)
  • P1909 [NOIP2016 普及组] 买铅笔 题解