MyBatis的MapperScan和Mapper注解,你会混淆吗?

背景

笔者参与的项目使用了多模块结构,不同模块使用 SpringBoot ,基本结构差不多,最近排查一个问题时,发现两个模块,一个没有使用 @MapperScan ,另一个使用了该注解,但是 MyBatis 的 Mapper 类都能被正确扫描到。

统一代码结构,去掉 @MapperScan 注解后,对应模块报错,提示注入 DAO 类失败。于是对比了下两个工程,跟踪两个注解的使用方法,找到了问题的根源。本文来整理下这个过程。

@MapperScan 扫描方式

@MapperScan 注解会将指定目录下所有 DAO 类封装成 MyBatis 的 BaseMapper 类,然后注入 Spring 容器中,不需要额外的注解,就可以完成注入,常见的 DAO 定义如下:

package xxx.xxx.xxx.dao;
public interface IXXXDao  extends BaseMapper<XXX>{}

需要注意的是@MapperScan 扫描路径下除了 MyBatis 的 DAO 类,不应该有自定义的普通 DAO 接口及其实现类

工程启动类使用了扫描注解:

@MapperScan({"xx.xxmodule.dao"})

项目启动时会报错:
在这里插入图片描述
可见非继承自 BaseMapper普通接口及其实现类都被封装成 Mapper 类注入了,最终导致引用该 DAO 的 Service 类依赖注入失败。

规避办法有两个:

  1. 自定义的普通接口类单独放置,区别 MyBatis 的 dao 和工程自定义 dao【推荐】。
  2. 为 Impl 实现类添加 @Primary 接口,弊端是无实际意义的接口定义也被当做 Mapper 封装了【不推荐】。

@Mapper 注解方式

使用 @Mapper 注解时,debug 日志模式下,我们能看到 MyBatis 自动注入时会自动扫描启动类目录下所有的 @Mapper 注解,主要日志为:

2020-10-25 10:01:31,850 DEBUG (MybatisPlusAutoConfiguration.java:275)- 
Searching for mappers annotated with @Mapper
2020-10-25 10:33:08,200 DEBUG (MybatisPlusAutoConfiguration.java:275)- 
Using auto-configuration base package 'cn.xx.xx.xx'

启示录

详细了解这俩的用法后,发现项目中用得很混乱,这是两种不同的注入 MyBatis DAO 实体的方法,选择其一即可,而项目中这两种注解都存在。

实际上,使用 @MapperScan 后,对应包的 DAO 类就无需 @Mapper 了;如果使用 @Mapper ,就不需要 @MapperScan

而工程中,基本上所有的 DAO 类都用了 @Mappper 注解,同时又为启动类设置了 @MapperScan,那么由于 @MapperScan 优先级高,@Maper失效了。

究其根源可能是,代码都是拷贝过来的,没人深究不同配置有什么区别吧。而@MapperScan 的出现,就是为了解决每个类都要写 @Mapper 这个繁琐步骤的!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
mapperScan注解mapper注解MyBatis框架中的两种注解,它们的作用略有不同。 mapperScan注解用于在启动类上添加,通过指定Mapper类的包路径进行扫描,从而将mapper层中的接口自动注入为bean,无需再在每个mapper接口上添加@Mapper注解。 这样做可以简化开发过程,减少代码冗余。 而mapper注解则是用于在mapper接口上添加的注解,通过xml文件的namespace命名空间自动注入bean,需要在每个mapper接口上添加@Mapper注解。这种方式相对较繁琐,需要手动为每个mapper接口添加注解。 总结来说,mapperScan注解是用于自动扫描mapper接口并将其注入为bean的,而mapper注解是用于手动标注mapper接口的。它们的使用方式和效果有所区别,开发者可以根据自己的需求选择适合的注解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MapperScan注解和@Mapper的区别,怎么用](https://blog.csdn.net/weixin_46310452/article/details/112682728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [详解 @MapperScan 注解和 @Mapper 注解](https://blog.csdn.net/jialiguo/article/details/100019472)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值