本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近公司里的一个同事,突然问我,为什么有的项目用 @MapperScan,有的用 @Mapper?
我告诉他,这是一个好问题,说明他思考了。求知欲望很强,看好他的前途。
实际上,这是一个非常简单的问题。我并没有一口回绝他,让他去百度。因为,新人都会经历这个过程。好不容易,问你一次,你直接让他百度,会打击到他的。而且,别人会觉得你摆架子。
@Mapper 这个注解的定义如下:
@Documented
@Inherited
@Retention(RUNTIME)
@Target({ TYPE, METHOD, FIELD, PARAMETER })
public @interface Mapper {
// Interface Mapper
}
@Mapper 一般我们用在接口上,代码如下:
@Mapper
public interface UserDAO {
@Select("select * from user where name = #{name}")
User find(String name);
@Select("select * from user where name = #{name} and pwd = #{pwd}")
/**
* 对于多个参数来说,每个参数之前都要加上@Param注解,
* 要不然会找不到对应的参数进而报错
*/
User login(@Param("name")String name, @Param("pwd")String pwd);
}
使用 @Mapper,最终 Mybatis 会有一个拦截器,会自动的把 @Mapper 注解的接口生成动态代理类。这点可以在 MapperRegistry 类中的源代码中查看。
@Mapper 注解针对的是一个一个的类,相当于是一个一个 Mapper.xml 文件。而一个接口一个接口的使用 @Mapper,太麻烦了,于是 @MapperScan 就应用而生了。@MapperScan 配置一个或多个包路径,自动的扫描这些包路径下的类,自动的为它们生成代理类。
@SpringBootApplication
@MapperScan({"com.xttblog.mapper","com.xttblog.dao"})
public class XttblogApp {
public static void main(String[] args) {
SpringApplication.run(XttblogApp.class, args);
}
}
当使用了 @MapperScan 注解,将会生成 MapperFactoryBean, 如果没有标注 @MapperScan 也就是没有 MapperFactoryBean 的实例,就走 @Import 里面的配置,具体可以在 AutoConfiguredMapperScannerRegistrar 和 MybatisAutoConfiguration 类中查看源代码进行分析。
由此可见,动态代理和 AOP 知识非常的重要,各种框架都在大量的使用。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 详解 @MapperScan 注解和 @Mapper 注解