> 技术文档 > 通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2


文章目录

  • 通过SpringBoot+H2数据库+Mybatis实现DAO单元测试
    • 1.下载安装H2内存数据
      • 特点
      • 用途
      • 1.1 下载H2内存数据库安装包绿色版
      • 1.2 安装教程
      • 1.3 登录h2数据库
      • 1.4 创建数据库
    • 2.通过idea搭建SpringBoot项目
      • 2.1 idea通过脚手架spring initializr
      • 2.2 配置信息
        • 2.2.1 依赖管理pom.xml
        • 2.2.2 配置yml
        • 2.2.3 实体类
        • 2.2.4 数据层java
        • 2.2.5 数据层映射类
        • 2.2.6 主启动类
    • 3.DAO数据层进行单元测试
      • 代码解释

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试

可能出现的问题

1.下载h2数据库绿色版zip速度慢

2.Database “C:/Users/com/test” not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149 (帮助)

1.下载安装H2内存数据库

H2数据库

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

H2 数据库是一个用 Java 编写的开源的关系型数据库,它具有以下特点和用途,下面为你详细介绍:

特点

  1. 轻量级:H2 数据库的核心仅由一个 Java 类库组成,无需复杂的安装过程,下载后即可使用。它的体积小巧,不依赖于外部服务,这使得它在资源受限的环境中也能轻松运行。
  2. 支持多种运行模式:H2 支持嵌入式、服务器模式以及混合模式。在嵌入式模式下,数据库与应用程序运行在同一个 JVM 中,适合小型应用或测试环境;服务器模式允许多个客户端连接到同一个数据库实例,适用于多用户场景;混合模式则结合了前两者的优点。
  3. 兼容性良好:它支持 SQL:2011 标准,兼容多种常见的数据库,如 MySQL、Oracle 等。这意味着开发者可以使用熟悉的 SQL 语法进行操作,并且在不同数据库之间迁移代码时相对容易。
  4. 性能高:H2 数据库在处理数据时速度较快,尤其是在内存模式下,它将数据存储在内存中,避免了磁盘 I/O 的开销,从而大大提高了读写性能。
  5. 易于集成:由于是用 Java 编写的,H2 可以很方便地与 Java 应用程序集成,是 Java 项目开发和测试的理想选择。

用途

  1. 开发和测试:在开发和测试阶段,使用 H2 数据库可以快速搭建一个轻量级的数据库环境,无需安装和配置复杂的数据库服务器。开发人员可以在本地轻松运行和测试代码,提高开发效率。
  2. 嵌入式系统:由于其轻量级和嵌入式的特性,H2 适合嵌入到各种小型应用程序、设备或系统中,为其提供数据存储和管理功能。
  3. 演示和原型:在创建应用程序的演示版本或原型时,H2 可以作为临时数据库使用,帮助开发者快速展示应用的功能和特性。

1.1 下载H2内存数据库安装包绿色版

https://www.h2database.com/html/download-archive.html

1.2 安装教程

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

1.3 登录h2数据库

打开bin目录,双击h2.bat,弹出黑窗口,web页面如下

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

成功

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

h2数据库web界面

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

1.4 创建数据库

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

2.通过idea搭建SpringBoot项目

2.1 idea通过脚手架spring initializr

通过SpringBoot+H2数据库+Mybatis实现DAO单元测试_springboot mybatis h2

2.2 配置信息

2.2.1 依赖管理pom.xml

修改parent版本号2.2.1RELEASE

JAVA版本为8

<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/>  </parent> <groupId>com.geekmice</groupId> <artifactId>third</artifactId> <version>0.0.1-SNAPSHOT</version> <name>third</name> <description>third</description> <properties> <java.version>8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>  <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies></project>
2.2.2 配置yml

src/main/resources目录下创建application.properties文件,添加如下配置:

// 这行代码配置了应用程序要连接的H2数据库的实际URL。jdbc:h2:tcp://localhost/~/test表示这是// 一个通过TCP连接到本地服务器的H2数据库,数据库文件存储在用户主目录下,名称为test。// 与内存数据库不同,这种配置下的数据库会在硬盘上保存数据,即使应用程序停止后数据仍然存在。spring.datasource.url=jdbc:h2:tcp://localhost/~/test// 这行配置指定了用于连接H2数据库的JDBC驱动类的名称。org.h2.Driver是H2数据库的JDBC驱动。spring.datasource.driver-class-name=org.h2.Driver// 这行配置设置了数据库连接的用户名。H2数据库默认的用户名是sa。spring.datasource.username=sa// 这行配置设置了数据库连接的密码。H2数据库默认的密码也是sa。spring.datasource.password=sa// 这行配置用于MyBatis框架,指定了Mapper XML文件的位置。MyBatis是Java的一个持久层框架,classpath:mapper/*.xml表示// 在项目的classpath下的mapper文件夹中查找所有的XML文件,这些文件包含了SQL语句和对应的Java方法映射。mybatis.mapper-locations=classpath:mapper/*.xml// 这行配置同样用于MyBatis,指定了类型别名的包路径。com.geekmice.third.entity包下的所有类都可以// 使用它们的简单类名作为别名,而不是需要写全限定名,这在编写Mapper XML文件时可以简化代码。mybatis.type-aliases-package=com.geekmice.third.entity// 这行配置启用了H2数据库的Web控制台功能,允许通过浏览器访问数据库进行管理操作。spring.h2.console.enabled=true// 这行配置指定了H2数据库Web控制台的访问路径。通过访问http://localhost:8080/h2-console//(假设Spring Boot应用的默认端口为8080),可以打开H2数据库的控制台界面。spring.h2.console.path=/h2-console
2.2.3 实体类
package com.geekmice.third.entity;import lombok.Data;/** * (Users)实体类 * * @author pmb * @since 2025-04-29 21:22:07 */@Datapublic class Users { private Integer id; private String name; private String email;}
2.2.4 数据层java
package com.geekmice.third.mapper;import com.geekmice.third.entity.Users;import org.apache.ibatis.annotations.Mapper;/** * @Author pmb * @Desc (Users)表数据库访问层 * @Date 2025-04-29 21:22:06 */@Mapperpublic interface UsersMapper { /** * 根据ID查详情 */ Users queryById(Integer id); /** * 新增数据 */ int insert(Users users); /** * 通过主键删除数据 */ int deleteById(Integer id);}
2.2.5 数据层映射类
<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\"><mapper namespace=\"com.geekmice.third.mapper.UsersMapper\"> <resultMap type=\"com.geekmice.third.entity.Users\" id=\"UsersVOMap\"> <result property=\"id\" column=\"ID\" jdbcType=\"INTEGER\"/> <result property=\"name\" column=\"NAME\" jdbcType=\"VARCHAR\"/> <result property=\"email\" column=\"EMAIL\" jdbcType=\"VARCHAR\"/> </resultMap>  <select id=\"queryById\" parameterType=\"int\" resultType=\"com.geekmice.third.entity.Users\"> SELECT ID,  NAME,  EMAIL FROM USERS WHERE ID = #{id} LIMIT 1 </select>  <insert id=\"insert\" keyProperty=\"id\" useGeneratedKeys=\"true\"> INSERT INTO USERS(NAME, EMAIL) VALUES (#{name}, #{email}) </insert>  <update id=\"update\"> UPDATE USERS <set> <if test=\"name != null and name != \'\'\"> NAME = #{name}, </if> <if test=\"email != null and email != \'\'\"> EMAIL = #{email}, </if> </set> WHERE ID = #{id} </update>  <delete id=\"deleteById\"> DELETE FROM USERS WHERE ID = #{id} </delete></mapper>
2.2.6 主启动类
package com.geekmice.third;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@MapperScan(\"com.geekmice.third.mapper\")@SpringBootApplicationpublic class ThirdApplication { public static void main(String[] args) { SpringApplication.run(ThirdApplication.class, args); }}

3.DAO数据层进行单元测试

创建UsersMapperTest进行单元测试

package com.geekmice.third.mapper;import com.geekmice.third.entity.Users;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.AfterEach;import org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest@Slf4jpublic class UsersMapperTest { @Autowired private UsersMapper usersMapper; private static final ThreadLocal<Integer> idThreadLocal = new ThreadLocal<>(); @BeforeEach void setUp() { log.info(\"setUp\"); // insert some data into database Users users = new Users(); users.setName(\"Tom\"); users.setEmail(\"tom@example.com\"); int count = usersMapper.insert(users); System.out.println(\"insert count: \" + count); idThreadLocal.set(users.getId()); } @AfterEach void tearDown() { log.info(\"tearDown\"); // delete data from database usersMapper.deleteById(idThreadLocal.get()); idThreadLocal.remove(); } @Test void queryById_success() { log.info(\"{},queryById_success\", idThreadLocal.get()); Users users = usersMapper.queryById(idThreadLocal.get()); assert idThreadLocal.get() == users.getId(); }}

代码解释

依赖添加:添加Spring Boot,Mybatis,H2数据库以及测试需要的依赖。

数据库配置:使用内存数据库H2,方便单元测试

实体类:Users映射数据库中users表

DAO接口:UsersMapper接口定义数据访问方法

单元测试:UserMapperTest类使用@SpringBootTest注解加载Spring Boot应用上下文,对UsersMapper的queryById方法进行测试。