通过SpringBoot+H2数据库+Mybatis实现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 编写的开源的关系型数据库,它具有以下特点和用途,下面为你详细介绍:

特点

  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 安装教程

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 复制代码
<?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文件,添加如下配置:

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 实体类
java 复制代码
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
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 复制代码
<?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 主启动类
java 复制代码
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进行单元测试

java 复制代码
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方法进行测试。

相关推荐
W001hhh1 小时前
260111
java·数据库
inksci1 小时前
Python 中使用 SQL 连接池
服务器·数据库·python
正在走向自律1 小时前
金仓数据库KingbaseES基础语法详解与实践指南
数据库·国产数据库·ddl·dml·kingbasees·sql语法·电科金仓
alonewolf_991 小时前
MySQL全局优化详解与8.0新特性全面解读
数据库·mysql
ASS-ASH1 小时前
快速处理虚拟机磁盘扩容问题
linux·数据库·vmware·虚拟机·磁盘扩容
Coder_Boy_1 小时前
Spring Boot 事务回滚异常 UnexpectedRollbackException 详解(常见问题集合)
java·spring boot·后端
爱写bug的野原新之助1 小时前
数据库及navicat工具
数据库·网络爬虫·工具
数据知道2 小时前
一文掌握 MongoDB 存储引擎 WiredTiger 的原理
数据库·mongodb·数据库架构
期待のcode2 小时前
TransactionManager
java·开发语言·spring boot
Full Stack Developme2 小时前
Mycat 2 实现 MySQL 读写分离,并且实现 主从同步
android·数据库·mysql