Mapper的注解 @Mapper、@Repository、@MapperScan
- 一、@Mapper
- 1.1、主要作用
- 1.2、示例
- 二、@Repository
- 2.1、主要作用
- 2.2、示例
- 2.3、注意事项
- 三、@MapperScan
@Mapper
是 Mybatis 的注解,和 Spring 没有关系,
@Repository
是 Spring 的注解,用于声明一个 Bean。
@MapperScan
是Spring Boot 提供的注解,用于指定要扫描的Mapper接口包路径,并将这些接口自动注册为Spring Bean。
一、@Mapper
在Java开发中,特别是在使用MyBatis框架时,@Mapper
注解扮演着重要的角色。它主要用于指示某个接口是一个MyBatis的Mapper接口,这样MyBatis框架就可以自动识别并处理它。
1.1、主要作用
-
标记 Mapper 接口:
@Mapper
注解用于标识一个接口为MyBatis的Mapper接口。这告诉MyBatis生成这个接口的代理对象,代理对象会实现接口中定义的数据库访问操作。 -
避免 Mapper XML文件:虽然MyBatis允许使用XML文件来配置SQL语句和接口绑定,使用
@Mapper
注解可以让你完全省略XML配置。所有的SQL可以通过注解如@Select
,@Update
,@Insert
, 和@Delete
直接在Mapper接口的方法上声明。
1.2、示例
下面是一个简单的例子,展示了如何使用 @Mapper
注解在MyBatis中定义一个Mapper接口。
package com.example.mapper;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);
}
在这个例子中,UserMapper 接口通过 @Mapper
注解被标记为MyBatis的Mapper接口。@Select
注解用于指定获取用户信息的SQL查询。
@Mapper 注解是MyBatis与Spring集成时用于简化配置和增强模块整洁性的有用工具。通过使用它,开发者可以更加便捷地在Spring应用中实现数据访问层,无需处理复杂的XML配置。
二、@Repository
Mapper接口本身并不是Spring管理的Bean。MyBatis的Mapper接口是用于定义数据库操作方法的接口,并不需要由Spring来管理生命周期或进行依赖注入。
@Repository
是Spring Framework 中的注解之一,用于标识一个类为数据访问层(DAO)的组件,通常与持久化操作相关。它的作用类似于 @Component
注解,但专门用于标识数据访问组件,让Spring容器知道这个类是用来进行数据库操作的。
2.1、主要作用
- 标识数据访问组件:
@Repository
注解用于标识一个类为数据访问层(DAO)的组件。这告诉Spring容器将这个类实例化并管理起来,可以在其他组件中通过依赖注入使用它。 - 异常转换:
@Repository
注解还具有将数据访问层产生的数据访问异常(例如JDBC异常)转换为Spring的数据访问异(DataAccessException)的功能。这样可以统一异常处理,并且可以选择性地处理不同类型的异常。 - 自动异常转换:在Spring的数据访问框架中,如Spring JDBC或Spring Data JPA,使用
@Repository
注解的类会自动启用异常转换功能,将底层的数据库异常转换为Spring的数据访问异常,方便统一处理。
2.2、示例
下面是一个简单的示例,展示了如何使用 @Repository
注解标识一个数据访问层(DAO)的类:
import org.springframework.stereotype.Repository;@Repository
public class UserRepository {// 数据访问方法public User getUserById(int id) {// 实际的数据库操作return userRepository.findById(id);}
}
在这个例子中,UserRepository 类被标记为 @Repository
,表示它是一个数据访问组件,用来进行数据库操作。当其他组件需要访问数据库时,可以通过依赖注入的方式使用 UserRepository
类。
tips:
如果没有标注 @Repository 的数据访问组件,例如mapper文件,在使用@Autowired 依赖注入的时候,idea 会报红,因为spring 种没有识别到这个文件。但是又可以正常运行,是因为 Mybatis 识别到了@Mapper文件或者 @MapperScan 扫描到。因此可以在 mapper 文件加上 @Repository 注解,让Spring认识它,这样 idea 就不会报红了。
2.3、注意事项
虽然 @Repository
注解通常用于标识数据访问组件,但并不是强制要求每个数据访问类都要加上这个注解。如果你的项目中使用了Spring Data JPA或其他数据访问框架,并且遵循了这些框架的规范,那么这些框架会自动处理数据访问组件的注册和异常转换,你可能不需要手动添加 @Repository
注解。
在Spring Boot应用中,通常会使用Spring Data JPA或其他持久化框架来简化数据访问层的开发,这些框架已经处理了数据访问组件的注册和异常转换,因此对于基于这些框架的数据访问类,你可能不需要手动添加 @Repository 注解。
三、@MapperScan
可以使用Spring的 @MapperScan
注解来扫描MyBatis的Mapper接口,并将它们注册为Spring管理的Bean。这样,你就可以在其他组件中直接注入Mapper接口,而无需在Mapper接口上添加额外的注解。
@SpringBootApplication
@ComponentScan(basePackages = {"com.example"})
@MapperScan("com.example.bickerrecord.dao")
public class BickerrecordApplication {public static void main(String[] args) {SpringApplication.run(BickerrecordApplication.class, args);}}
这样,所有在 com.example.mapper 包下的接口都会被自动注册为MyBatis的Mapper接口。且不用加任何注解。