Mybatis中@MapperScan和@Mapper注解,Spring中的@Repository注解
一、@Mapper和@MapperScan注解
使用 @Mapper,最终 Mybatis 会有一个拦截器,会自动的把 @Mapper 注解的接口生成动态代理类。这点可以在 MapperRegistry 类中的源代码中查看。
@Mapper 注解针对的是一个一个的接口,相当于是一个一个 Mapper.xml 文件。而一个接口一个接口的使用 @Mapper,太麻烦了,于是 @MapperScan 就应用而生了。@MapperScan 配置一个或多个包路径,自动的扫描这些包路径下的类,自动的为它们生成代理类。
类似于如下的Mybatis Mapper配置:
二、Spring与Mybatis 中的@Repository与@Mapper
@Mapper 是 Mybatis 的注解,和Spring没有关系,@Repository是Spring的注解,用于声明一个Bean。
1. Mybatis中的@Mapper注解
使用 Mybatis 有 XML 文件或者注解的两种使用方式,如果是使用 XML 文件的方式,我们需要在配置文件中指定 XML 的位置,这里只研究注解开发的方式。
在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解。
@Mapper
public interface OrderDao {
...
}
2. Spring中的@Repository注解
@Repository用于声明 dao 层的 bean,如果我们要真正地使用 @Repository 来进行开发,那是基于代码的开发,简单来说就是手写 JDBC。
和@Service、@Controller一样,我们将@Repository添加到对应的实现类上。
@Repositorypublic class OrderDaoImpl implements OrderDao{ @Override public int insertOrder(){ JdbcTemplate template = new JdbcTemplate(); ... }}
3. @Mapper、@Repository、@MapperScan注解
@Mapper 一定要有,否则 Mybatis 找不到 mapper。Mybatis中MapperScannerConfigurer 自动扫描将Mapper接口生成代理注入到Spring容器。
@Repository 可有可无,可以消去依赖注入的报错信息。
@MapperScan 可以替代 @Mapper。