Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)

Spring Boot + MyBatis 项目中常用注解详解

在现代Java开发中,Spring BootMyBatis是两大热门框架,广泛应用于构建高效、可维护的企业级应用。两者结合使用,可以充分发挥各自的优势,提高开发效率和代码质量。在这个过程中,注解(Annotations)起到了关键作用。本文将详细、全面地讲解在Spring Boot + MyBatis项目中常用的注解及其含义和作用,并通过分类整理,帮助开发者更好地理解和运用这些工具。

目录


Spring Boot 常用注解

Spring Boot 提供了丰富的注解来简化开发过程。以下将这些注解按照功能进行分类,便于理解和应用。

核心注解

@SpringBootApplication

含义与作用@SpringBootApplication 是一个复合注解,包含了 @Configuration@EnableAutoConfiguration@ComponentScan。用于标注主类,启用Spring Boot的自动配置和组件扫描功能。

示例

java 复制代码
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

组件标识注解

这些注解用于标识不同层次的组件,便于Spring进行自动扫描和管理。

@RestController

含义与作用@RestController@Controller@ResponseBody 的组合注解,用于标识控制器类,适用于构建RESTful Web服务。所有方法返回的对象会自动序列化为JSON或XML。

示例

java 复制代码
@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/users")
    public List<User> getAllUsers() {
        // 返回用户列表
    }
}
@Controller

含义与作用@Controller 用于标识控制器类,通常与视图解析器(如Thymeleaf)配合使用,适用于传统的MVC模式。

示例

java 复制代码
@Controller
public class HomeController {

    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("message", "Hello World");
        return "home";
    }
}
@Service

含义与作用@Service 用于标识业务逻辑层的组件,增强代码的可读性和可维护性。它也是一个 @Component,因此会被Spring扫描和管理。

示例

java 复制代码
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}
@Repository

含义与作用@Repository 用于标识数据访问层的组件,通常与持久化技术(如JPA、MyBatis)结合使用。它还提供了异常转换功能,将持久层异常转换为Spring的统一异常。

示例

java 复制代码
@Repository
public class UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> findAll() {
        // 查询数据库
    }
}
@Component

含义与作用@Component 是一个通用的Spring管理的组件注解,用于标识任何Spring管理的Bean。其他注解(如 @Service@Repository@Controller)都是 @Component 的特化。

示例

java 复制代码
@Component
public class Utility {

    public void performTask() {
        // 执行任务
    }
}

依赖注入注解

这些注解用于实现Spring的依赖注入机制,简化Bean的管理和使用。

@Autowired

含义与作用@Autowired 用于自动装配Bean,可以应用于构造函数、字段或Setter方法。Spring会根据类型自动注入匹配的Bean。

示例

java 复制代码
@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    // 或者通过构造函数注入
    // private final OrderRepository orderRepository;
    //
    // @Autowired
    // public OrderService(OrderRepository orderRepository) {
    //     this.orderRepository = orderRepository;
    // }
}
@Qualifier

含义与作用@Qualifier@Autowired 一起使用,用于在多个Bean候选者中指定要注入的具体Bean。

示例

java 复制代码
@Service
public class PaymentService {

    @Autowired
    @Qualifier("creditCardPayment")
    private PaymentProcessor paymentProcessor;
}
@Inject

含义与作用@Inject 是JSR-330规范的注解,与 @Autowired 类似,用于实现依赖注入。功能上与 @Autowired 基本相同,但不支持 required 属性。

示例

java 复制代码
@Service
public class NotificationService {

    @Inject
    private EmailService emailService;
}

配置注解

用于定义和管理应用的配置和Bean。

@Configuration

含义与作用@Configuration 用于标识配置类,类似于传统的XML配置文件。可以在配置类中定义Bean,并进行依赖注入的配置。

示例

java 复制代码
@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
@Bean

含义与作用@Bean 用于在 @Configuration 类中定义Bean,Spring会管理这些Bean的生命周期和依赖。

示例

java 复制代码
@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        // 配置数据源
    }
}
@Value

含义与作用@Value 用于注入配置文件中的属性值,可以注入到字段、方法参数或构造函数参数中。

示例

java 复制代码
@Component
public class AppProperties {

    @Value("${app.name}")
    private String appName;

    @Value("${app.version}")
    private String appVersion;
}
@ConfigurationProperties

含义与作用@ConfigurationProperties 用于将配置文件中的属性映射到一个Java对象中,适用于大量相关属性的绑定。

示例

java 复制代码
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private String name;
    private String version;

    // getters and setters
}

事务管理注解

用于声明事务管理,确保数据一致性和完整性。

@Transactional

含义与作用@Transactional 用于声明事务管理,适用于需要事务控制的方法或类。可以指定事务的传播行为、隔离级别、回滚规则等。

示例

java 复制代码
@Service
public class PaymentService {

    @Transactional
    public void processPayment(Order order) {
        // 执行支付逻辑
    }
}

Web层注解

用于处理Web请求和响应,简化控制器的开发。

请求映射注解

这些注解用于定义HTTP请求的路径和方法,简化路由配置。

@RequestMapping

含义与作用@RequestMapping 用于定义请求的URL路径和HTTP方法,适用于类级别和方法级别。它是一个通用的映射注解,可以通过 method 属性指定具体的HTTP方法。

示例

java 复制代码
@RestController
@RequestMapping("/api")
public class UserController {

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public List<User> getAllUsers() {
        // 返回用户列表
    }
}
@GetMapping

含义与作用@GetMapping@RequestMapping 的快捷方式,用于处理HTTP GET请求。适用于方法级别,简化代码。

示例

java 复制代码
@GetMapping("/users")
public List<User> getAllUsers() {
    // 返回用户列表
}
@PostMapping

含义与作用@PostMapping@RequestMapping 的快捷方式,用于处理HTTP POST请求。适用于方法级别,简化代码。

示例

java 复制代码
@PostMapping("/users")
public ResponseEntity<Void> createUser(@RequestBody User user) {
    // 创建用户
}
@PutMapping

含义与作用@PutMapping@RequestMapping 的快捷方式,用于处理HTTP PUT请求。适用于方法级别,简化代码。

示例

java 复制代码
@PutMapping("/users/{id}")
public ResponseEntity<Void> updateUser(@PathVariable Long id, @RequestBody User user) {
    // 更新用户
}
@DeleteMapping

含义与作用@DeleteMapping@RequestMapping 的快捷方式,用于处理HTTP DELETE请求。适用于方法级别,简化代码。

示例

java 复制代码
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
    // 删除用户
}
参数绑定注解

这些注解用于将HTTP请求中的参数绑定到控制器方法的参数上。

@PathVariable

含义与作用@PathVariable 用于绑定URL路径中的变量到方法参数,常用于RESTful API中的资源标识。

示例

java 复制代码
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    // 根据ID获取用户
}
@RequestParam

含义与作用@RequestParam 用于绑定HTTP请求中的参数到方法参数,适用于查询参数或表单参数。

示例

java 复制代码
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String name, @RequestParam int age) {
    // 根据姓名和年龄搜索用户
}
@RequestBody

含义与作用@RequestBody 用于将HTTP请求体中的JSON或XML数据绑定到方法参数,常用于处理POST和PUT请求中的数据。

示例

java 复制代码
@PostMapping("/users")
public ResponseEntity<Void> createUser(@RequestBody User user) {
    // 创建用户
}
@ResponseBody

含义与作用@ResponseBody 用于将方法返回的对象序列化为JSON或XML并写入HTTP响应体,通常与 @Controller 一起使用。@RestController 已经包含了 @ResponseBody 的功能。

示例

java 复制代码
@Controller
public class UserController {

    @GetMapping("/users")
    @ResponseBody
    public List<User> getAllUsers() {
        // 返回用户列表
    }
}

MyBatis 常用注解

MyBatis 是一个优秀的持久层框架,通过映射语句将数据库操作与Java方法关联。MyBatis提供了一系列注解,简化了XML映射文件的使用。

Mapper接口注解

@Mapper

含义与作用@Mapper 用于标识MyBatis的Mapper接口,Spring会自动扫描并生成代理对象。通常与 @MapperScan 配合使用。

示例

java 复制代码
@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(@Param("id") Long id);
}

SQL操作注解

这些注解用于定义具体的SQL语句,关联到Mapper接口的方法上,实现数据库的CRUD操作。

@Select

含义与作用@Select 用于标注查询语句,关联到接口的方法上,实现数据库的查询操作。

示例

java 复制代码
@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> getAllUsers();
}
@Insert

含义与作用@Insert 用于标注插入语句,关联到接口的方法上,实现数据库的插入操作。

示例

java 复制代码
@Mapper
public interface UserMapper {

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);
}
@Update

含义与作用@Update 用于标注更新语句,关联到接口的方法上,实现数据库的更新操作。

示例

java 复制代码
@Mapper
public interface UserMapper {

    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);
}
@Delete

含义与作用@Delete 用于标注删除语句,关联到接口的方法上,实现数据库的删除操作。

示例

java 复制代码
@Mapper
public interface UserMapper {

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(@Param("id") Long id);
}

参数绑定注解

@Param

含义与作用@Param 用于给方法参数命名,以便在SQL语句中引用。特别适用于有多个参数的方法。

示例

java 复制代码
@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
    List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") int age);
}

结果映射注解

这些注解用于定义查询结果与Java对象属性的映射关系,适用于字段名与属性名不一致的情况。

@Results 和 @Result

含义与作用@Results@Result 用于定义查询结果与Java对象属性的映射关系,适用于字段名与属性名不一致的情况。

示例

java 复制代码
@Mapper
public interface UserMapper {

    @Select("SELECT id, user_name, email_address FROM users WHERE id = #{id}")
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "name", column = "user_name"),
        @Result(property = "email", column = "email_address")
    })
    User getUserById(@Param("id") Long id);
}

关联映射注解

用于定义对象之间的一对一或一对多关系,适用于复杂的对象关系映射。

@One 和 @Many

含义与作用@One@Many 用于定义一对一和一对多的关联关系,适用于复杂的对象关系映射。

示例

java 复制代码
@Mapper
public interface OrderMapper {

    @Select("SELECT * FROM orders WHERE id = #{id}")
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "user", column = "user_id", 
                one = @One(select = "com.example.mapper.UserMapper.getUserById"))
    })
    Order getOrderById(@Param("id") Long id);
}

综合示例

为了更好地理解上述注解的应用,下面通过一个简单的用户管理系统示例,展示Spring Boot与MyBatis如何协同工作。

项目结构

复制代码
src
├── main
│   ├── java
│   │   └── com.example.demo
│   │       ├── DemoApplication.java
│   │       ├── controller
│   │       │   └── UserController.java
│   │       ├── service
│   │       │   └── UserService.java
│   │       ├── mapper
│   │       │   └── UserMapper.java
│   │       └── model
│   │           └── User.java
│   └── resources
│       └── application.properties

1. 主类

java 复制代码
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

说明@MapperScan 指定MyBatis的Mapper接口扫描路径,确保@Mapper接口能够被正确识别和代理。

2. 实体类

java 复制代码
public class User {
    private Long id;
    private String name;
    private String email;

    // getters and setters
}

3. Mapper 接口

java 复制代码
@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> getAllUsers();

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(@Param("id") Long id);

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);

    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(@Param("id") Long id);
}

4. 服务类

java 复制代码
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }

    public User getUserById(Long id) {
        return userMapper.getUserById(id);
    }

    public void createUser(User user) {
        userMapper.insertUser(user);
    }

    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    public void deleteUser(Long id) {
        userMapper.deleteUser(id);
    }
}

5. 控制器类

java 复制代码
@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    // 获取所有用户
    @GetMapping
    public List<User> listUsers() {
        return userService.getAllUsers();
    }

    // 根据ID获取用户
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.getUserById(id);
        if(user != null){
            return ResponseEntity.ok(user);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    // 创建用户
    @PostMapping
    public ResponseEntity<Void> createUser(@RequestBody User user) {
        userService.createUser(user);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    // 更新用户
    @PutMapping("/{id}")
    public ResponseEntity<Void> updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        userService.updateUser(user);
        return ResponseEntity.ok().build();
    }

    // 删除用户
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return ResponseEntity.noContent().build();
    }
}

6. 配置文件

properties 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.configuration.map-underscore-to-camel-case=true

# 显示SQL语句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

说明

  • map-underscore-to-camel-case=true:自动将数据库下划线命名转换为Java的驼峰命名。
  • log-impl:设置MyBatis的日志实现,这里使用标准输出日志。

总结

在Spring Boot + MyBatis项目中,注解的使用极大地简化了配置和开发流程。通过合理运用各种注解,可以实现代码的高内聚低耦合,提升项目的可维护性和扩展性。本文按照功能对Spring Boot和MyBatis中的常用注解进行了分类讲解,并通过一个综合示例展示了它们的实际应用。希望能帮助开发者在实际项目中更好地理解和运用这些注解,构建高效、稳定的应用系统。


附录:常用注解对照表

注解类别 注解名称 作用
核心注解 @SpringBootApplication 标注主类,启用自动配置和组件扫描
组件标识注解 @RestController 标识REST控制器,返回JSON/XML数据
@Controller 标识MVC控制器,返回视图
@Service 标识业务逻辑层组件
@Repository 标识数据访问层组件,提供异常转换
@Component 通用组件注解
依赖注入注解 @Autowired 自动装配Bean
@Qualifier 指定注入的具体Bean
@Inject 实现依赖注入(JSR-330规范)
配置注解 @Configuration 标识配置类
@Bean 定义Bean
@Value 注入配置属性值
@ConfigurationProperties 绑定配置属性到Java对象
事务管理注解 @Transactional 声明事务管理
Web层注解 @RequestMapping 定义请求路径和方法
@GetMapping 处理GET请求
@PostMapping 处理POST请求
@PutMapping 处理PUT请求
@DeleteMapping 处理DELETE请求
@PathVariable 绑定URL路径变量到方法参数
@RequestParam 绑定请求参数到方法参数
@RequestBody 绑定请求体到方法参数
@ResponseBody 将方法返回值序列化到响应体
MyBatis注解 @Mapper 标识Mapper接口
@Select 定义SELECT语句
@Insert 定义INSERT语句
@Update 定义UPDATE语句
@Delete 定义DELETE语句
@Param 命名方法参数
@Results 定义结果集映射
@Result 定义单个结果映射
@One 定义一对一关联
@Many 定义一对多关联

通过对这些注解的深入理解和正确使用,可以有效提升Spring Boot + MyBatis项目的开发效率和代码质量。


摊牌了,不装了,整理不易,我想要你手中的赞和关注🌼🌼🌼

相关推荐
LI JS@你猜啊几秒前
window安装docker
java·spring cloud·eureka
书中自有妍如玉10 分钟前
.net 使用MQTT订阅消息
java·前端·.net
风铃儿~36 分钟前
Spring AI 入门:Java 开发者的生成式 AI 实践之路
java·人工智能·spring
斯普信专业组41 分钟前
Tomcat全方位监控实施方案指南
java·tomcat
忆雾屿1 小时前
云原生时代 Kafka 深度实践:06原理剖析与源码解读
java·后端·云原生·kafka
武昌库里写JAVA1 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
云之兕1 小时前
MyBatis 的动态 SQL
数据库·sql·mybatis
gaoliheng0061 小时前
Redis看门狗机制
java·数据库·redis
我是唐青枫1 小时前
.NET AOT 详解
java·服务器·.net
小白杨树树1 小时前
【WebSocket】SpringBoot项目中使用WebSocket
spring boot·websocket·网络协议