目录
前言
MyBatis作为Java生态中广泛使用的持久层框架,主要用途是代替JDBC来操作数据库,其核心设计思想是将SQL与Java代码解耦。而Mapper接口正是实现这一理念的关键桥梁——它让我们仅需定义Java接口,即可优雅地操作数据库,彻底告别传统JDBC的模板式代码
一、Mapper接口的本质
Mapper接口是一个普通的Java接口,其中声明了数据库操作方法:
package com.module.mapper;
import com.module.pojo.Student;
import java.util.List;
public interface StudentMapper {
//定义抽象方法
public List<Student> selectStudent();
}
关键点:接口本身没有实现类!MyBatis通过动态代理在运行时生成实现对象
二、核心工作原理:动态代理
1.代理对象生成流程

当我们调用 Mapper 接口中的方法时,MyBatis 并不会直接让我们去实现这个接口,而是通过动态代理的方式为其生成一个代理对象。这个代理对象会拦截所有对 Mapper 接口方法的调用,从而完成后续的数据库操作。
2. 核心组件协作
-
MapperProxy:这是 MyBatis 框架中实现了 JDK 动态代理InvocationHandler接口的类。当通过session.getMapper(StudentMapper.class)获取代理对象时,MyBatis 会创建MapperProxy实例作为调用处理器,它会拦截 Mapper 接口方法的调用,进而协调后续的 SQL 执行流程。
-
MapperMethod:同样是 MyBatis 自定义的 Java 类,用于封装 Mapper 接口方法对应的 SQL 操作信息,包括 SQL 类型(SELECT/INSERT 等)、参数处理规则、结果转换逻辑等,是连接接口方法与底层 SQL 执行的关键桥梁。
-
MappedStatement:存储XML/注解中的SQL元数据。映射文件中定义了与数据库操作相关的 SQL 语句、参数映射、结果集映射等信息。MyBatis 会根据 Mapper 接口的全限定名去寻找对应的映射文件,或者通过注解的方式在接口方法上直接定义 SQL 语句,实现接口方法与 SQL 操作的绑定。
当代理对象拦截到方法调用后,会根据方法名、参数等信息,从映射文件或注解中找到对应的 SQL 语句。然后,MyBatis 会处理参数,将其正确地传递到 SQL 语句中,执行 SQL 操作,并对返回的结果集进行处理,按照映射规则转换为对应的 Java 对象返回给调用者。
这三个组件形成了MyBatis的执行链骨架。MapperProxy是入口,MapperMethod是转换引擎,MappedStatement是操作蓝图。它们这均属于 MyBatis 框架的源码实现,大家如果感兴趣可以等我后面出一篇

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



