2026/5/6 19:42:52
网站建设
项目流程
3 MyBatis 测试流程与核心原理解析
3.1 测试类整体结构
该UserTest类是基于 JUnit 框架的 MyBatis 测试类,主要包含四部分:
- 成员变量:存储关键对象(输入流、数据库会话、接口代理)。
- @Before 方法(init):测试前初始化资源,构建 MyBatis 运行环境。在每个@Test方法执行前自动调用,用于初始化资源(如加载配置文件、创建数据库连接)。
- @After 方法(destory):测试后释放资源,避免内存泄漏。在每个@Test方法执行后自动调用,用于释放资源(如关闭连接、流)。
- @Test方法:调用接口方法并验证结果。
UserTest 类就像一个 “测试实验室”,专门用来验证你的代码能不能正确从数据库里查数据。比如你写了个 “查用户” 的功能,得在这里试试好不好用。
3.1.1 成员变量详解
成员变量
private InputStream in = null; // 配置文件输入流 private SqlSession session = null; // MyBatis数据库会话 private UserDao userDao = null; // 数据访问接口代理对象
作用:
- in:读取SqlMapConfig.xml配置文件。
- session:执行 SQL、管理事务的核心对象。
- userDao:通过代理调用UserDao接口的方法,映射 XML 中的 SQL。
3.1.2 @Before 方法
@Before 方法:初始化 MyBatis 环境
@Before //前置通知, 在方法执行之前执行 public void init() throws IOException { //1. 找配置文件 //加载主配置文件,目的是为了构建SqlSessionFactory对象 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 造一个"数据库连接器"工厂 //创建SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3. 用工厂造一个"数据库连接器" //通过SqlSessionFactory工厂对象创建SqlSesssion对象 session = factory.openSession(); // 4. 造一个"查数据的工具" //通过Session创建UserDao接口代理对象 userDao = session.getMapper(UserDao.class); }
- Resources.getResourceAsStream("SqlMapConfig.xml"):从类路径(src/main/resources)读取 MyBatis 全局配置文件,转换为输入流。
- 注意:文件需位于resources目录下,且文件名必须与参数一致(如SqlMapConfig.xml)。
白话:先找到 MyBatis 的 “使用说明书”(SqlMapConfig.xml),里面写着怎么连数据库、去哪找 SQL 语句。
- SqlSessionFactoryBuilder:构建器类,通过build(InputStream)方法解析配置文件,生成SqlSessionFactory。
- SqlSessionFactory:工厂类,用于创建SqlSession(数据库会话),是线程安全的,建议在项目中作为单例存在。
白话:根据说明书,造一个 “连接器工厂”,专门生产连数据库的工具。
- factory.openSession():创建数据库会话,默认autoCommit=false(手动提交事务)。
白话:用工厂生产一个 “数据库连接器”(session),相当于拿到了操作数据库的钥匙。
注:如果增删改操作后数据库没变化,需要在测试方法里加 session.commit(),因为MyBatis 默认不自动保存。如果查不到数据,可能是 SQL 语句写错了,或者数据库连接信息(账号密码)不对,也可能是表名和实体类名对不上。
- session.getMapper(UserDao.class):通过动态代理生成UserDao接口的实现类对象。
- 本质:该对象会将接口方法调用转换为 XML 中对应的 SQL 执行(如userDao.findAll()对应UserMapper.xml中的)。白话:再用连接器造一个 “查数据的工具”(userDao),这个工具能帮你执行 SQL 语句。
3.1.3 @After 方法
@After public void destory() { if (session != null) session.close(); if (in != null) in.close(); }
用完数据库连接器和说明书后,要记得 “关门”(关闭连接和文件),不然会浪费资源,就像用完水龙头不关会漏水一样。
3.1.4 @Test 方法
@Test 注解替代 main 方法
- 在 JUnit 测试中,@Test注解标识的方法(如aaa())会被测试框架自动执行,相当于程序的入口,无需手动编写main方法。
- 若去掉@Test,方法无法被执行;添加后,框架会调用该方法进行测试。
@Test public void aaa() { // 用工具查所有用户 List<User> users = userDao.findAll(); // 把查到的用户打印出来看看 for (User user : users) { System.out.println(user); } }
白话:
- 用 “查数据的工具” 喊一声 “给我查所有用户!”(userDao.findAll())。
- 工具会偷偷找到说明书里写的 SQL 语句(比如 select * from user),去数据库把数据查出来。
- 把查到的用户数据存到一个篮子里(List),然后逐个打印出来,看看是不是你想要的结果。
3.2 核心概念
MyBatis 是一款基于 Java 的持久层框架,通过 ORM(对象关系映射)机制 将数据库操作与 Java 代码解耦。它允许开发者通过 XML 或注解配置 SQL 语句,避免直接编写繁琐的 JDBC 原生代码,实现 Java 对象与数据库表的映射关系,提升数据访问的开发效率。
白话:帮你省力气的 “数据库翻译官”,不用写复杂的连接代码,直接用 Java 方法调 SQL 语句。
- 配置文件(SqlMapConfig.xml)的作用(位置src/main/resources)
- 作用:作为 MyBatis 的全局配置文件,包含数据库连接池配置(驱动、URL、用户名、密码)和映射文件注册(mappers标签)。
- 白话:MyBatis 的 “使用说明书”,写着数据库账号密码、SQL 语句在哪找等重要信息。
UserDao 是遵循 DAO(数据访问对象)模式 定义的接口,用于封装用户相关的数据操作。其方法(如 findAll())通过 MyBatis 的动态代理机制,与映射文件中定义的 SQL 语句绑定。当调用接口方法时,MyBatis 会将其转换为对应的 SQL 执行,并将结果映射为 Java 对象(如 User 实体)返回,实现 “接口方法到 SQL 语句” 的自动化转换。
白话:定义的 “查数据接口”,比如 findAll() 就是 “查所有用户” 的命令,MyBatis 会把它翻译成 SQL 去执行。
JUnit 是 Java 单元测试框架,通过注解实现测试流程的自动化管理:
- @Before:标注的方法在每个测试用例执行前自动调用,用于初始化资源(如加载 MyBatis 配置、创建数据库会话);
- @Test:标注具体的测试方法(如 aaa()),用于验证业务逻辑(如查询用户列表);
- @After:标注的方法在测试用例执行后调用,用于释放资源(如关闭数据库连接、输入流),避免资源泄漏。
整个流程遵循 “准备资源 → 执行测试 → 清理资源” 的生命周期管理模式,确保测试的可靠性和可重复性。
白话:自动运行测试的 “机器人”,@Before 是测试前的准备,@Test 是真正的测试任务,@After 是测试后的打扫。