Mybatis中@MapperScan和@Mapper注解,Spring中的@Repository注解

yunzhonmghe 2019-12-30

一、@Mapper和@MapperScan注解

使用 @Mapper,最终 Mybatis 会有一个拦截器,会自动的把 @Mapper 注解的接口生成动态代理类。这点可以在 MapperRegistry 类中的源代码中查看。

Mybatis中@MapperScan和@Mapper注解,Spring中的@Repository注解

@Mapper 注解针对的是一个一个的接口,相当于是一个一个 Mapper.xml 文件。而一个接口一个接口的使用 @Mapper,太麻烦了,于是 @MapperScan 就应用而生了。@MapperScan 配置一个或多个包路径,自动的扫描这些包路径下的类,自动的为它们生成代理类。

Mybatis中@MapperScan和@Mapper注解,Spring中的@Repository注解

类似于如下的Mybatis Mapper配置:

Mybatis中@MapperScan和@Mapper注解,Spring中的@Repository注解

二、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容器。

Mybatis中@MapperScan和@Mapper注解,Spring中的@Repository注解

@Repository 可有可无,可以消去依赖注入的报错信息。

@MapperScan 可以替代 @Mapper。

相关推荐