今天做一个springBoot项目,dao层中用到了mapper注解,突然想到另一个注解repository,二者都是可以将接口类注册为bean并被扫描到spring容器中,于是我把mapper改成repository,但是报错了。
我一直理解的是,componentscan+repository=mapper,springBoot约定大于配置,自动带有component注解,不应该报错呀。
是少了什么步骤吗,还是我理解错了?
求大伙解惑
你的理解有一些偏差。虽然@Mapper
和@Repository
注解有相似之处,但是它们的作用是不同的。@Mapper
注解是用来标识MyBatis的Mapper接口的,它是MyBatis框架中用于实现DAO层的核心注解。
而@Repository
注解则是Spring框架中用于标识DAO层的注解,它实际上是对@Component
注解的细化,表明该类是用来完成数据访问的。
虽然@Repository
注解可以被扫描到Spring容器中,但它并不能像@Mapper
注解一样与MyBatis框架一同工作。如果你想在MyBatis中使用这个接口,你需要使用@Mapper
注解或者在MyBatis的配置文件中手动指定这个接口的映射。
因此,你应该在使用@Mapper
注解而不是@Repository
注解来标识MyBatis的Mapper接口。
那么你也可以使用使用@Repository
注解和JPA可以方便地实现数据的增删改操作。在使用JPA时,你可以使用CrudRepository
接口提供的基本数据访问操作,也可以使用JpaRepository
接口提供的更丰富的数据访问操作。
首先,定义一个使用@Repository
注解标识的JpaRepository实现类,如下所示:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
@Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 和@component 是 Spring 的注解,用于声明一个 Bean。
在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解。