@Mapper,@MapperScan与@Repository区别

本文介绍了MyBatis从3.4.0开始引入的@Mapper注解,该注解使得可以直接在接口中定义SQL,编译后自动生成实现类。同时,通过@MapperScan可以在Springboot启动类中批量扫描指定包下的所有接口,生成对应的实现类,避免手动添加@Mapper。当使用@MapperScan时,需要注意避免注册不必要的接口为bean,可以通过指定annotationClass参数来解决此问题。

从mybatis3.4.0开始加入了@Mapper注解,它可以在编译之后自动生成相应的接口实现类,不用再写如下图所示的mapper映射文件。

用@Mapper直接在接口中写 ,编译时自动生成实现类,具体写法见下图。

如果需要让多个接口都变成实现类,用@Mapper一个个添加太麻烦,这时我们在Springboot启动类添加@MapperScan,指定要扫描的mapper的包的路径,然后包下面的所有接口在编译之后都会生成相应的实现类,实现批量添加@Mapper注解。

根据百度结果,@Mapper = @MapperScan(自动扫描配置)+Repository,单独有Mapper的时候,Autowired会报错,但可以运行。

简而言之,批量用@MapperScan,单个@Mapper

注:

@MapperScan用来扫描定义包下的所有的接口,给接口都生成一个bean(经测试,即便bean已经存在,@MapperScan还是会将这些接口再注册一个bean,导致出错)。

其源码里有个annotationClass,默认值是Annotation.classs。

Class<? extends Annotation> annotationClass() default Annotation.class;

 注解如下所示加个参数,就能解决上面的问题。

@MapperScan(basePackages = "com.zhi.test", annotationClass = Mapper.class)

  经验证,一些无关的接口不再注册为一个bean。

(——引自关于MyBatis的@Mapper和@MapperScan注解的一点思考 - 玄同太子 - 博客园

### 常用 Spring 注解及其作用 Spring 框架提供了丰富的注解来简化开发流程,提高代码的可读性和可维护性。以下是常用的 Spring 注解及其具体用途和使用方法: #### 1. 组件扫描 Bean 管理 - **@Component**:这是一个通用的组件注解,用于标识一个类为 Spring 的组件[^1]。Spring 容器会自动扫描并注册带有此注解的类作为 Bean。 - **@Service**:通常用于业务逻辑层(Service 层)的实现类上,它是 @Component 的一种特化形式[^2]。 - **@Repository**:用于持久层(DAO 层),主要用于数据库操作,也是 @Component 的一种特化形式[^3]。 - **@Controller**:用于控制层(Controller 层),结合 @RequestMapping 使用,处理 HTTP 请求[^4]。 - **@RestController**:是 @Controller 和 @ResponseBody 的组合,返回的数据直接写入 HTTP 响应体中[^5]。 - **@Mapper**:在 MyBatis 中用于接口上,表示该接口是一个 Mapper 接口,Spring 会为其生成代理对象[^6]。 - **@MapperScan**:用于配置类上,指定要扫描的包路径,将其中的接口自动注册为 Mapper Bean[^7]。 #### 2. 配置相关注解 - **@Configuration**:标记一个类为配置类,相当于传统的 XML 配置文件[^8]。 - **@Bean**:标注在一个方法上,返回的对象会被注册为 Spring 容器中的 Bean。通常 @Configuration 一起使用[^9]。 - **@ComponentScan**:用于启用组件扫描,自动检测和注册 Bean[^10]。 #### 3. 依赖注入 - **@Autowired**:用于自动装配 Bean,可以用于字段、构造器、方法等[^11]。 - **@Qualifier**:当有多个相同类型的 Bean 时,可以通过此注解指定具体的 Bean 名称[^12]。 - **@Resource**:类似于 @Autowired,但默认按名称进行装配[^13]。 - **@Value**:用于注入属性值,支持 SpEL 表达式[^14]。 #### 4. Web 相关注解 - **@RequestMapping**:用于映射 HTTP 请求到控制器的方法上,可以指定 URL 路径、请求方法等[^15]。 - **@GetMapping / @PostMapping**:分别用于映射 GET 和 POST 请求,是 @RequestMapping 的快捷方式[^16]。 - **@RequestParam**:用于获取请求参数,可以指定参数名、是否必需等[^17]。 - **@PathVariable**:用于获取 URL 中的路径变量[^18]。 - **@RequestBody**:用于将请求体中的数据绑定到方法参数上,常用于接收 JSON 数据[^19]。 - **@ResponseBody**:用于将方法返回值直接写入 HTTP 响应体中,常用于 RESTful 接口[^20]。 #### 5. 事务管理 - **@Transactional**:用于开启事务管理,可以应用于类或方法级别[^21]。 ### 示例代码 ```java @Configuration @ComponentScan(basePackages = "com.example") public class AppConfig { @Bean public UserService userService() { return new UserService(); } } @Service public class UserService { @Autowired private UserRepository userRepository; public void doSomething() { userRepository.save(); } } @Repository public class UserRepository { public void save() { // Save logic here } } @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUser(@PathVariable Long id) { return userService.getUserById(id); } @PostMapping public void createUser(@RequestBody User user) { userService.createUser(user); } } ``` ### 相关问题 1. 如何在 Spring Boot 中使用 @Mapper@MapperScan? 2. @Component 和 @Bean 在实际应用中有何区别? 3. 如何通过 @Value 注入外部配置文件中的属性? 4. @Transactional 注解在哪些场景下需要使用,如何正确配置? 5. @RestController 和 @Controller 之间有什么主要区别
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值