目录

一、引言

二、Mapper的基本概念

1. 什么是Mapper

2. 特点

三、Mapper的定义与使用

1. 定义方式

(1) 接口 + XML映射文件

(2) 接口 + 注解

区别:

2. 绑定与调用

四、Mapper的底层原理

1. 动态代理实现

2. namespace与方法名映射

五、常见问题与注意事项

1. 接口与XML必须对应

2. namespace必须一致

3. 参数绑定规则

六、总结


一、引言

  在日常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找不到等问题时快速定位并解决。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐