MyBatis Mapper:使用与原理详解
本文介绍了MyBatis中的Mapper机制,它是通过接口定义数据访问方法,利用动态代理实现SQL绑定和执行的核心组件。文章详细讲解了Mapper的两种定义方式(XML映射和注解)、底层动态代理原理(通过namespace+方法名定位SQL)以及使用注意事项(接口与XML对应、namespace一致等)。Mapper机制简化了JDBC操作,使开发者只需关注SQL与方法的映射关系,提高了代码的可维护
目录
一、引言
在日常Java开发中,数据库操作是必不可少的一环。传统JDBC方式虽然灵活,但代码冗长、维护成本高。MyBatis作为优秀的ORM框架,为我们提供了Mapper这一核心机制,让数据库操作变的更加简洁、高效、可维护。
Mapper的存在,让我们只需定义接口与SQL的映射关系,就能完成数据查询与修改,无需关心底层JDBC细节。
二、Mapper的基本概念
1. 什么是Mapper
在MyBatis中,Mapper是一个用于绑定SQL与Java方法的接口。它定义了数据访问的方法,但并不直接实现这些方法,而是通过MyBatis的动态代理机制,在运行时为这些接口生成实现类,并执行与之对应的SQL。
2. 特点
- 无需实现类:只定义接口和方法签名
- 自动绑定SQL:通过XML或注解将方法绑定到SQL
- 易维护:业务代码与SQL分离
三、Mapper的定义与使用
1. 定义方式
(1) 接口 + XML映射文件
public interface UserMapper {
User selectUserByUid(int uid);
}
<mapper namespace="com.my.mapper.UserMapper">
<select id="findUserByUid" parameterType="int" resultType="User">
select *
from user
where user_id = #{uid}
</select>
</mapper>
(2) 接口 + 注解
public interface UserMapper {
@Select("SELECT * FROM user WHERE user_id = #{uid}")
User selectUserByUid(int uid);
}
区别:
- XML方式:SQL独立存放,易维护,适合复杂查询
- 注解方式:开发快,但不利于后期维护
2. 绑定与调用
// 1.加载MyBatis的主配置文件
InputStream is = Resources.getResourceAsStream("MyBatis_Config.xml");
// 2.创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 3.创建SqlSessionFactory
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(is);
// 4.创建SqlSession,类似jdbc的Connection与Statement的结合
SqlSession session = factory.openSession(true);
// 5.加载映射器
UserMapper userMapper = session.getMapper(UserMapper.class);
// 6.通过接口调用方法
User user = userMapper.findUserByUid(1);
通过SqlSession.getMapper()获取的对象,并不是接口的实现类,而是MyBatis创建的动态代理对象。
四、Mapper的底层原理
1. 动态代理实现
Mapper接口的工作原理是基于JDK反射方式的动态代理实现。MyBatis运行时,会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,根据映射器接口的完全限定名+方法名,唯一定位到一个MapperStatement并调用Executor执行器所代表的SQL语句,然后将SQL执行结果按照resultType或resultMap的映射规则进行封装并返回。
2. namespace与方法名映射
MyBatis通过namespace + 方法名唯一定位SQL,例如:
<mapper namespace="com.my.mapper.UserMapper">
<select id="findUserByUid" parameterType="int" resultType="User">
select *
from user
where user_id = #{uid}
</select>
</mapper>
五、常见问题与注意事项
1. 接口与XML必须对应
- 一般要求接口与XML文件的路径、名称一致
2. namespace必须一致
- namespace必须等于接口的全类名,否则找不到SQL
3. 参数绑定规则
- #{}会进行预编译,防止SQL注入
- ${}会直接拼接字符串,需谨慎使用
六、总结
Mapper是MyBatis中最贴近开发者的接口层,它屏蔽了底层JDBC操作的复杂性,让我们只需关注映射配置和SQL的绑定即可。无论是XML还是注解方式,本质都是通过动态代理来将方法调用转化为SQL执行。
熟悉Mapper的工作原理,不仅能帮助我们更好地使用MyBatis,还能在遇到映射错误、SQL找不到等问题时快速定位并解决。
更多推荐



所有评论(0)