文章目录
- 通过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数据库
H2 数据库是一个用 Java 编写的开源的关系型数据库,它具有以下特点和用途,下面为你详细介绍:
特点
- 轻量级:H2 数据库的核心仅由一个 Java 类库组成,无需复杂的安装过程,下载后即可使用。它的体积小巧,不依赖于外部服务,这使得它在资源受限的环境中也能轻松运行。
- 支持多种运行模式:H2 支持嵌入式、服务器模式以及混合模式。在嵌入式模式下,数据库与应用程序运行在同一个 JVM 中,适合小型应用或测试环境;服务器模式允许多个客户端连接到同一个数据库实例,适用于多用户场景;混合模式则结合了前两者的优点。
- 兼容性良好:它支持 SQL:2011 标准,兼容多种常见的数据库,如 MySQL、Oracle 等。这意味着开发者可以使用熟悉的 SQL 语法进行操作,并且在不同数据库之间迁移代码时相对容易。
- 性能高:H2 数据库在处理数据时速度较快,尤其是在内存模式下,它将数据存储在内存中,避免了磁盘 I/O 的开销,从而大大提高了读写性能。
- 易于集成:由于是用 Java 编写的,H2 可以很方便地与 Java 应用程序集成,是 Java 项目开发和测试的理想选择。
用途
- 开发和测试:在开发和测试阶段,使用 H2 数据库可以快速搭建一个轻量级的数据库环境,无需安装和配置复杂的数据库服务器。开发人员可以在本地轻松运行和测试代码,提高开发效率。
- 嵌入式系统:由于其轻量级和嵌入式的特性,H2 适合嵌入到各种小型应用程序、设备或系统中,为其提供数据存储和管理功能。
- 演示和原型:在创建应用程序的演示版本或原型时,H2 可以作为临时数据库使用,帮助开发者快速展示应用的功能和特性。
1.1 下载H2内存数据库安装包绿色版
https://www.h2database.com/html/download-archive.html
1.2 安装教程
1.3 登录h2数据库
打开bin目录,双击h2.bat,弹出黑窗口,web页面如下
成功
h2数据库web界面
1.4 创建数据库
2.通过idea搭建SpringBoot项目
2.1 idea通过脚手架spring initializr
2.2 配置信息
2.2.1 依赖管理pom.xml
修改parent版本号2.2.1RELEASE
JAVA版本为8
<?xml version="1.0" encoding="UTF-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/> <!-- lookup parent from repository --></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><!--lombok--><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*/
@Data
public 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*/
@Mapper
public interface UsersMapper {/*** 根据ID查详情*/Users queryById(Integer id);/*** 新增数据*/int insert(Users users);/*** 通过主键删除数据*/int deleteById(Integer id);}
2.2.5 数据层映射类
<?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.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><!--根据ID查详情--><select id="queryById" parameterType="int" resultType="com.geekmice.third.entity.Users">SELECT ID,NAME,EMAILFROM USERSWHERE 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">DELETEFROM USERSWHERE 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")
@SpringBootApplication
public 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
@Slf4j
public class UsersMapperTest {@Autowiredprivate UsersMapper usersMapper;private static final ThreadLocal<Integer> idThreadLocal = new ThreadLocal<>();@BeforeEachvoid setUp() {log.info("setUp");// insert some data into databaseUsers 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());}@AfterEachvoid tearDown() {log.info("tearDown");// delete data from databaseusersMapper.deleteById(idThreadLocal.get());idThreadLocal.remove();}@Testvoid 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方法进行测试。