MyBatis源码分析之——构建源码分析测试用例

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一、源码准备首先,到MyBatis官方GitHub地址将MyBatis源码Fork到自己的GitHub仓库中。

一、源码准备


首先,到MyBatis官方GitHub地址将MyBatis源码Fork到自己的GitHub仓库中。


意:MyBatis官方GitHub地址为:https://github.com/mybatis/mybatis-3

笔者GitHub地址为:https://github.com/sunshinelyz/mybatis

将MyBatis源码Fork完成后,通过IDEA将MyBatis源码从自己的GitHub地址导入到IDEA中。

在随后的MyBatis源码分析过程中,笔者将会按照https://github.com/sunshinelyz/mybatis 中的代码进行详细分析,并将一些测试用例和代码注释以及流程图提交到https://github.com/sunshinelyz/mybatis 链接地址。


二、源码改造


1.添加resources目录


首先,下载后的源码在src/test/目录下没有resources目录,我们创建MyBatis的源码测试用例时需要构建一个较为完整的数据库查询Demo,需要在src/test/resources目录下创建相应的配置文件。所以,需要在MyBatis源码的src/test目录下创建resources目录。创建完成后,需要将resources目录设置为source目录。将resources目录设置为source目录的过程如下所示。


(1)打开项目结构


单击IDEA的“File”—> “Project Structure”打开项目的结构


1.jpg


(2)将resources目录设置为source目录


过程按下图所示。


2.jpg


2.添加依赖环境


编辑MyBatis的pom.xml文件,添加一些测试用例需要使用的Jar文件,首先在properties节点中添加一些依赖的环境的版本属性,如下所示。


<properties>
    <!--此处省略n多配置项--->
    <!--下面几个是自己加的-->
    <lombok.version>1.16.10</lombok.version>
    <fastjson.version>1.2.62</fastjson.version>
    <jdbc.version>5.1.48</jdbc.version>
</properties>


接下来,在pom.xml文件的dependencies节点下添加依赖的Jar环境,如下所示


 <dependencies>
    <!---前面省略n多配置-->
    <!---后面的依赖是自己加的-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>${fastjson.version}</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${jdbc.version}</version>
    </dependency>
 </dependencies>


3.编辑配置文件


(1)创建MyBatis配置文件


在新创建的resources目录下创建mybatis目录,并在mybatis目录下创建mybatis-config.xml配置文件,mybatis-config.xml文件如下所示。


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
    <setting name="logImpl" value="LOG4J"/>
  </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mybatis/UserMapper.xml"/>
       <!-- <mapper class="io.binghe.mybatis.mapper.UserMapper"/>-->
    </mappers>
</configuration>

(2)修改log4j.properties文件


修改MyBatis源码下的src/test/java下的log4j.properties文件,在log4j.properties文件的最后添加如下一行代码。


#MyBatis日志配置
log4j.logger.io.binghe.mybatis=TRACEE


4.创建测试类


注意:测试用例的所有Java类都是在MyBatis源码下的src/test/java目录下创建的。


(1)创建实体类User


在io.binghe.mybatis.entity包下创建测试实体类User,User类总体上比较简单,只包含id、username和age三个属性,如下所示。


package io.binghe.mybatis.entity;
import lombok.ToString;
import java.io.Serializable;
/**
 * @author binghe
 * @version 1.0.0
 * @description 测试实体类
 */
@ToString
public class User implements Serializable {
    private static final long serialVersionUID = 821465757967990094L;
    private int id;
    private String username;
    private int age;
    public User() {
    }
    public User(int id, String username, int age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}


(2)创建User类的Mapper接口


在io.binghe.mybatis.mapper包下创建UserMapper接口,如下所示。


package io.binghe.mybatis.mapper;
import io.binghe.mybatis.entity.User;
import org.apache.ibatis.annotations.Select;
/**
 * @author binghe
 * @version 1.0.0
 * @description User类的Mapper接口
 */
public interface UserMapper {
   // @Select("select * from t_user where id = #{id}")
    User selectUser(Integer id);
}


(3)创建UserMapper接口对应的UserMapper.xml文件


在src/test/resources/mybatis目录下创建UserMapper接口对应的UserMapper.xml文件,UserMapper.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="io.binghe.mybatis.mapper.UserMapper">
    <select id="selectUser" resultType="io.binghe.mybatis.entity.User">
       select * from t_user where id = #{id}
  </select>
</mapper>


这里,有两个需要注意的地方:


  • UserMapper.xml文件中的namespace属性需要和UserMapper接口的全类名相同。
  • UserMapper.xml文件中的select标签的id属性需要和UserMapper接口中定义的方法名相同。


在后续的源码分析中,会详细阐述MyBatis中为何需要这样设置。


(4)创建测试类MyBatisTest


在io.binghe.mybatis.test包中创建测试程序的入口类MyBatisTest,如下所示。


package io.binghe.mybatis.test;
import io.binghe.mybatis.entity.User;
import io.binghe.mybatis.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
 * @author binghe
 * @version 1.0.0
 * @description 测试用例的入口类
 */
@Slf4j
public class MyBatisTest {
    @Test
    public void testXml() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("io.binghe.mybatis.mapper.UserMapper.selectUser",1);
        log.info(user.toString());
    }
    @Test
    public void testAnnotation() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.selectUser(1);
        log.info(user.toString());
    }
}


在MyBatisTest类中,提供了两个测试方法,一个是用于测试以xml文件方式配置MyBatis的testXml()方法,一个是用于测试以注解方式配置MyBatis的testAnnotation()方法。


(5)创建测试数据表


最后,在MySQL的test数据库下创建测试数据表t_user,并在t_user数据表中插入测试数据,如下所示。


CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT '',
  `age` int(2) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
INSERT INTO `test`.`t_user` (`id`, `username`, `age`) VALUES ('1', 'admin', '18');
INSERT INTO `test`.`t_user` (`id`, `username`, `age`) VALUES ('2', 'binghe', '19');
INSERT INTO `test`.`t_user` (`id`, `username`, `age`) VALUES ('3', 'zhangsan', '19');
INSERT INTO `test`.`t_user` (`id`, `username`, `age`) VALUES ('4', 'lisi', '19');



三、运行测试用例


运行MyBatisTest类中的testXml()方法,输出结果如下所示。


DEBUG [main] - ==>  Preparing: select * from t_user where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
TRACE [main] - <==    Columns: id, username, age
TRACE [main] - <==        Row: 1, admin, 18
DEBUG [main] - <==      Total: 1
 INFO [main] - User(id=1, username=admin, age=18)
Process finished with exit code 0


5.jpg


说明测试用例构建成功,接下来就可以分析MyBatis源码了。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
缓存 Devops jenkins
专家视角:构建可维护的测试架构与持续集成
【10月更文挑战第14天】在现代软件开发过程中,构建一个可维护且易于扩展的测试架构对于确保产品质量至关重要。本文将探讨如何设计这样的测试架构,并将单元测试无缝地融入持续集成(CI)流程之中。我们将讨论最佳实践、自动化测试部署、性能优化技巧以及如何管理和扩展日益增长的测试套件规模。
41 3
|
2月前
|
人工智能 数据可视化 API
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
98 2
|
11天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
11 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2天前
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
4天前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
27 1
|
4天前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
24 0
|
1月前
|
SQL 消息中间件 大数据
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
45 1
|
1月前
|
SQL 大数据 Apache
大数据-159 Apache Kylin 构建Cube 准备和测试数据(二)
大数据-159 Apache Kylin 构建Cube 准备和测试数据(二)
72 1
|
1月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
109 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
3月前
|
SQL Java 数据库
2、Mybatis-Plus 测试增、删、改、查
这篇文章是关于使用Mybatis-Plus进行数据库的增删改查操作的本地测试,包括创建数据库表、添加数据、创建使用lombok的实体类、添加mapper接口以及编写测试代码进行基本的数据库操作验证。
2、Mybatis-Plus 测试增、删、改、查
下一篇
无影云桌面