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

image-20250429224655197

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

image-20250429225558698

image-20250429225544606

1.3 登录h2数据库

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

image-20250429225905667

成功

image-20250429225949044

h2数据库web界面

image-20250429230033480

1.4 创建数据库

image-20250429230147488

image-20250429230203926

2.通过idea搭建SpringBoot项目

2.1 idea通过脚手架spring initializr

image-20250429230743520

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方法进行测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值