文章目录
通过SpringBoot+H2数据库+Mybatis实现DAO单元测试
可能出现的问题
1.下载安装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,
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")
@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 {
@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方法进行测试。