news 2026/6/23 21:28:12

Spring管理MyBatis Mapper接口的原理详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring管理MyBatis Mapper接口的原理详解

Spring管理MyBatis Mapper接口的原理详解

一、核心机制

Spring通过‌动态代理 + FactoryBean + 注解扫描‌机制管理MyBatis Mapper接口。Mapper接口本身无实现类,Spring通过JDK动态代理生成代理对象,实现接口方法调用。

二、执行流程
  1. 注解扫描
    @MapperScan注解触发MapperScannerRegistrar注册ClassPathMapperScanner扫描器,扫描指定包路径下的Mapper接口。

    @MapperScan("com.example.mapper")
  2. 注册BeanDefinition
    扫描器将Mapper接口注册为MapperFactoryBean类型Bean,BeanClass属性被修改为MapperFactoryBean

    // 生成的BeanDefinition BeanDefinition beanDef = new RootBeanDefinition(MapperFactoryBean.class); beanDef.getPropertyValues().add("mapperInterface", mapperInterface);
  3. 创建代理对象
    MapperFactoryBean.getObject()方法中调用sqlSession.getMapper(MapperInterface.class),MyBatis通过JDK动态代理生成实现类。

    // MapperFactoryBean核心逻辑 public Object getObject() { return getSqlSession().getMapper(this.mapperInterface); }
  4. 方法调用转发
    代理对象方法调用被MapperProxy.invoke()拦截,通过SQL映射执行数据库操作。

    // MapperProxy核心逻辑 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getDeclaringClass() == Object.class) { return method.invoke(this, args); } return execute(method, args); }
三、关键类和接口
类名/接口作用
@MapperScan扫描Mapper接口
MapperScannerRegistrar注册扫描器
ClassPathMapperScanner实际扫描类
MapperFactoryBeanFactoryBean,生成Mapper代理
SqlSession.getMapper()生成JDK动态代理
MapperProxy代理类实现逻辑
四、配置方式
  1. XML配置
    通过SqlSessionFactoryBeanMapperScannerConfigurer配置。

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> </bean>
  2. 注解配置
    使用@MapperScan注解简化配置。

    @Configuration @MapperScan("com.example.mapper") public class MyBatisConfig { @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean.getObject(); } }
五、注意事项
  1. 依赖注入
    Mapper接口通过@Autowired注入使用,Spring容器自动管理代理对象。

    @Autowired private UserMapper userMapper;
  2. 事务管理
    Spring通过SqlSessionTemplate包装SqlSession,实现事务控制。

    @Transactional public void updateUser(User user) { userMapper.update(user); }
  3. 日志配置
    MyBatis支持多种日志框架(如SLF4J、Log4j2),通过mybatis-config.xml配置。

    <settings> <setting name="logImpl" value="SLF4J"/> </settings>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:32:07

ISO 19011-2018管理体系审核指南中文版资源详解

ISO 19011-2018管理体系审核指南中文版资源详解 【免费下载链接】ISO19011-2018管理体系审核指南中文版下载仓库 ISO19011-2018 管理体系审核指南 (中文版) 下载仓库 项目地址: https://gitcode.com/Open-source-documentation-tutorial/89d46 核心价值 这份《ISO 1901…

作者头像 李华
网站建设 2026/6/23 18:18:43

第十届网络安全与信息工程国际会议(ICCSIE 2025)已被EI检索

经核实&#xff0c;第十届网络安全与信息工程国际会议&#xff08;ICCSIE 2025&#xff09;论文集已被EI数据库检索&#xff0c;详情信息见下文。ICCSIE 2025由北京工业大学、青海理工学院主办&#xff0c;浙江工业大学协办&#xff0c;ACM出版支持。2025年8月&#xff1a;录用…

作者头像 李华
网站建设 2026/6/23 6:49:23

MinerU API终极指南:3分钟快速上手PDF转Markdown神器

MinerU API终极指南&#xff1a;3分钟快速上手PDF转Markdown神器 【免费下载链接】MinerU A high-quality tool for convert PDF to Markdown and JSON.一站式开源高质量数据提取工具&#xff0c;将PDF转换成Markdown和JSON格式。 项目地址: https://gitcode.com/GitHub_Tren…

作者头像 李华
网站建设 2026/6/23 18:20:04

12.12 作业

1 简述CV技术的应用现状CV&#xff08;计算机视觉&#xff09;技术目前已广泛落地多领域&#xff0c;应用现状可简化为以下几点&#xff1a;工业领域&#xff1a;2D 视觉成流水线质检标配&#xff0c;3D 视觉用于高精度检测&#xff1b;视觉引导机械臂推动自动化升级。医疗领域…

作者头像 李华
网站建设 2026/6/23 18:21:07

简单上手的完整智能家居平台搭建指南

简单上手的完整智能家居平台搭建指南 【免费下载链接】awesome-home-assistant A curated list of amazingly awesome Home Assistant resources. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-home-assistant 想要打造一个真正属于自己的智能家居系统吗&#…

作者头像 李华
网站建设 2026/6/22 21:13:48

Linux 文件及用户的一些日常命令

一、用户提权限在 Linux 中切换为 root 用户主要有 3 种常用方法&#xff0c;切换后就能直接执行修改权限&#xff08;chown/chmod&#xff09;等管理员操作&#xff0c;具体步骤如下&#xff1a;方法 1&#xff1a;sudo -i&#xff08;推荐&#xff0c;加载完整 root 环境&…

作者头像 李华