Spring Boot + MyBatis 项目中常用注解详解
在现代Java开发中,Spring Boot 和MyBatis是两大热门框架,广泛应用于构建高效、可维护的企业级应用。两者结合使用,可以充分发挥各自的优势,提高开发效率和代码质量。在这个过程中,注解(Annotations)起到了关键作用。本文将详细、全面地讲解在Spring Boot + MyBatis项目中常用的注解及其含义和作用,并通过分类整理,帮助开发者更好地理解和运用这些工具。
目录
- [Spring Boot + MyBatis 项目中常用注解详解](#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项目的开发效率和代码质量。
摊牌了,不装了,整理不易,我想要你手中的赞和关注🌼🌼🌼