3 MyBatis 测试流程与核心原理解析
3.1 测试类整体结构
- 成员变量:存储关键对象(输入流、数据库会话、接口代理)。
- @Before 方法(init):测试前初始化资源,构建 MyBatis 运行环境。在每个@Test方法执行前自动调用,用于初始化资源(如加载配置文件、创建数据库连接)。
- @After 方法(destory):测试后释放资源,避免内存泄漏。在每个@Test方法执行后自动调用,用于释放资源(如关闭连接、流)。
- @Test方法:调用接口方法并验证结果。
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 //前置通知, 在方法执行之前执行 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)。
- 创建 SqlSessionFactory
- SqlSessionFactoryBuilder:构建器类,通过build(InputStream)方法解析配置文件,生成SqlSessionFactory。
- SqlSessionFactory:工厂类,用于创建SqlSession(数据库会话),是线程安全的,建议在项目中作为单例存在。
- 获取 SqlSession
- factory.openSession():创建数据库会话,默认autoCommit=false(手动提交事务)。
- 生成接口代理
- 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 方法
- 在 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 的定义
- 配置文件(SqlMapConfig.xml)的作用(位置src/main/resources)
- 作用:作为 MyBatis 的全局配置文件,包含数据库连接池配置(驱动、URL、用户名、密码)和映射文件注册(mappers标签)。
- 白话:MyBatis 的 “使用说明书”,写着数据库账号密码、SQL 语句在哪找等重要信息。
- UserDao 接口的定位
- JUnit 测试的机制
- @Before:标注的方法在每个测试用例执行前自动调用,用于初始化资源(如加载 MyBatis 配置、创建数据库会话);
- @Test:标注具体的测试方法(如 aaa()),用于验证业务逻辑(如查询用户列表);
- @After:标注的方法在测试用例执行后调用,用于释放资源(如关闭数据库连接、输入流),避免资源泄漏。