目录
Spring Boot 的注解具有以下作用:
-
简化配置: 注解可以帮助开发者简化配置文件的编写。通过使用注解,开发者可以在代码中直接标识出组件的作用、依赖关系等,而无需手动在配置文件中进行繁琐的配置。
-
自动装配: Spring Boot 的注解可以实现自动装配,即根据特定的规则自动地将组件注入到容器中,简化了依赖注入的过程。
-
提高可读性: 注解可以使代码更加直观和易于理解。通过在类或方法上添加注解,可以清晰地表明它们的作用和特性,使代码更加易于维护。
-
框架集成: Spring Boot 的注解与其他框架的注解可以进行良好的集成,例如与Spring MVC、JPA、Hibernate等框架结合使用,能够提供更丰富的功能和更高的灵活性。
-
提高开发效率: 注解的使用可以减少大量样板式的代码,降低了开发工作量,提高了开发效率。
-
方便扩展: 注解提供了更为灵活的扩展机制,可以根据需要自定义注解,从而实现各种自定义的功能和特性
我给大家介绍几个我常用的Spring Boot注解
实体类(entity classes)
在Java中,实体类(Entity classes)通常与数据库表相映射,用于表示数据库表中的数据行。在不同的Java持久化框架中,实体类使用的注解会有所不同
@Data
@Data
是Lombok库提供的一个注解,它可以为Java类自动生成一些通用的方法,如toString()
、equals()
、hashCode()
以及所有字段的getter
和setter
方法。
它能够大大简化类的编写,避免了手动编写这些通用方法所带来的重复性工作。通常用在数据对象(POJO,Plain Old Java Object)类上,这些类主要用于保存数据,而不包含复杂的业务逻辑。
举例来说,假设有一个简单的Java类:
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
}
使用@Data
注解后,Lombok将自动生成该类的toString()
、equals()
、hashCode()
方法以及name
和age
字段的getter
和setter
方法。这使得代码更简洁,易于理解,且减少了开发者的工作量。
然而,需要注意的是,尽管@Data
提供了便利,但有时可能会因为自动生成的方法不符合特定需求而产生问题。在某些情况下,你可能需要更精细的控制和定制生成的代码。
@TableName
@TableName
注解通常与 Java 持久化框架相关,尤其是在使用 MyBatis Plus ORM 框架时。MyBatis Plus 是 MyBatis 的一个增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
在 MyBatis Plus 中,@TableName
注解用于指定一个实体类对应的数据库表名。如果实体类的名称与数据库中的表名不一致,可以使用这个注解来明确映射关系。
例如,如果有一个数据库表名为 tbl_user
,而你希望在代码中使用 User
作为实体类的名称,你可以这样使用 @TableName
:
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("tbl_user")
public class User {
// 类的字段和数据库列的映射
}
这样,MyBatis Plus 在构建查询或执行操作时,就会将 User
类映射到 tbl_user
表。
@TableId
@TableId
是 MyBatis Plus 框架中的一个注解,用于标识实体类的主键属性。这个注解告诉 MyBatis Plus,该字段是数据库表的主键列,并且可以指定主键生成策略。
在 MyBatis Plus 中,@TableId
注解通常与 @TableName
注解一起使用,以便将实体类的字段映射到数据库表的对应列上。@TableId
注解可以接受两个参数:
value
:指定数据库表的主键列名。如果实体类属性名和表的主键列名一致,这个参数可以省略。type
:指定主键生成策略。MyBatis Plus 支持多种主键生成策略,如自增(IdType.AUTO
)、手动输入(IdType.NONE
)、UUID(IdType.UUID
)等。
下面是一个使用 @TableId
注解的例子:
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("tbl_user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
// 其他字段...
}
在这个例子中,User
类映射到数据库的 tbl_user
表,id
字段被标记为主键列,并且指定了主键生成策略为自增。这意味着当你插入一个新的 User
记录时,id
字段的值将由数据库自动生成。
@TableField
@TableField
是 MyBatis Plus 框架中的一个注解,用于指定实体类的属性如何映射到数据库表的列。当实体类的属性名与表中的列名不一致时,可以使用这个注解来定义映射关系。
这个注解非常有用,因为在实际开发中,数据库表的列名通常使用下划线命名法(例如 user_name
),而Java实体类的属性名则遵循驼峰命名法(例如 userName
)。@TableField
注解可以帮助框架理解这两种命名法之间的对应关系。
@TableField
注解的常用参数:
value
:指定数据库表的列名。exist
:标识该字段在数据库表中是否存在,默认值为true
。如果设置为false
,则表示该字段在数据库表中不存在,MyBatis Plus 在构建SQL语句时会忽略该字段。
下面是一个使用 @TableField
注解的例子:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("tbl_user")
public class User {
// 如果数据库表的列名与属性名一致,或者遵循驼峰转下划线的规则,可以不用指定value
private Long id;
// 明确指定属性userName对应数据库表中的user_name列
@TableField("user_name")
private String userName;
// 标识该属性在数据库表中不存在
@TableField(exist = false)
private String someOtherFieldNotInTable;
// 其他字段...
}
在这个例子中,User
类映射到数据库的 tbl_user
表。userName
属性通过 @TableField
注解映射到 user_name
列。someOtherFieldNotInTable
属性在数据库表中不存在,因此使用 @TableField(exist = false)
来标识。这样,MyBatis Plus 在构建SQL语句时,不会包含 someOtherFieldNotInTable
属性。
注解结合使用
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;
@Data // Lombok注解,自动生成getter、setter、toString等方法
@TableName("tbl_user") // 映射数据库表名
public class User {
@TableId(value = "user_id", type = IdType.AUTO) // 映射主键字段,自增
private Long id;
@TableField("user_name") // 映射用户名字段
private String userName;
@TableField("email") // 映射电子邮件字段
private String email;
// 其他字段和方法...
}
在这个例子中:
@Data
注解来自 Lombok,它为类自动生成了getter和setter方法,以及toString
、equals
和hashCode
方法。这减少了样板代码,使类更加简洁。@TableName("tbl_user")
指定了实体类User
映射到数据库中的tbl_user
表。@TableId(value = "user_id", type = IdType.AUTO)
指定了id
属性映射到表的user_id
列,并且这个列是自增的主键。@TableField
注解用于映射userName
和email
属性到对应的数据库列。
这种组合的使用方式使得实体类的定义既清晰又简洁,同时也充分利用了MyBatis Plus的自动映射功能和Lombok的代码简化功能。这样,你可以专注于业务逻辑,而不是编写和维护大量的样板代码。
数据持久层Mapper接口
在Spring Boot中,通常我们会使用MyBatis作为持久层框架,而在MyBatis中,Mapper指的是数据访问层的接口。这些Mapper接口定义了对数据库的CRUD操作,包括插入、更新、删除和查询等。
在Spring Boot中,这些Mapper接口通常不需要显式地编写实现类,而是由MyBatis框架通过动态代理来实现。开发者只需要编写Mapper接口及其对应的SQL语句,MyBatis框架会根据接口定义自动生成相应的实现,从而实现了数据访问层的逻辑。
因此,在Spring Boot中,Mapper并不是一个特定的类,而是一组接口,用于定义数据访问层的操作。
@Mapper @Results
@Results
和@Mapper
注解通常一起使用,以便在MyBatis中定义结果集映射。@Results
注解用于定义一个或多个结果集映射,它可以与@Select
、@Insert
、@Update
和@Delete
等注解一起使用,以便将查询结果映射到Java对象中。
下面是一个使用@Results
和@Mapper
注解的示例:
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "email", column = "email")
})
User findById(Long id);
}
在这个例子中,UserMapper
接口使用了@Mapper
注解,这意味着它是一个MyBatis的Mapper接口。findById
方法使用了@Select
注解,它指定了查询语句。@Results
注解用于定义结果集映射,它指定了如何将查询结果映射到User
对象中。@Result
注解用于定义单个属性的映射关系,它指定了Java对象的属性名和数据库表的列名。
需要注意的是,@Results
和@Result
注解通常与Java对象的属性名和数据库表的列名一一对应。如果Java对象的属性名和数据库表的列名一致,你可以省略@Result
注解中的property
和column
属性。
现业务逻辑Service类
在Spring框架中,Service类通常用于实现业务逻辑,它们封装了对数据访问层(DAO)的调用,并提供了一组操作数据的方法。Service类通常是一个中间层,它们与控制器(Controller)和数据访问层(DAO)之间进行交互,负责处理业务逻辑和数据处理。
@Service @Autowired
@Service
和@Autowired
注解通常一起使用,以便在Spring Boot中创建和注入Service实例。@Service
注解用于标识一个类是一个服务类(Service),它封装了业务逻辑,并提供了一组操作数据的方法。@Autowired
注解用于自动注入依赖项,它可以将其他组件的实例注入到Service类中,以便访问其他组件的功能。
下面是一个使用@Service
和@Autowired
注解的示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User getUserById(Long id) {
return userDao.findById(id);
}
public void saveUser(User user) {
userDao.save(user);
}
public void updateUser(User user) {
userDao.update(user);
}
public void deleteUser(Long id) {
userDao.delete(id);
}
}
在这个例子中,UserService
类使用了@Service
注解,这意味着它是一个服务类(Service)。@Autowired
注解用于自动注入UserDao
实例,以便访问数据库。getUserById
、saveUser
、updateUser
和deleteUser
方法分别用于查询、插入、更新和删除用户数据。这些方法可以在控制器(Controller)中调用,以实现对用户数据的操作。
需要注意的是,@Service
和@Autowired
注解通常与其他注解一起使用,以便让Spring Boot自动扫描并创建Service实例,并自动注入依赖项。如果你的Service类没有使用这些注解,你需要手动将它们注册为Spring组件,并手动注入依赖项。
控制层Controller类
Controller层是Spring MVC框架中的一个组件,它负责处理HTTP请求和响应。Controller层通常是一个中间层,它们与服务层(Service)和数据访问层(DAO)之间进行交互,负责处理HTTP请求和响应。
@Controller
@Controller
注解是Spring框架中的一个注解,它用于标识一个类是一个控制器(Controller)。Controller类通常用于处理HTTP请求和响应,它们接收HTTP请求并返回HTTP响应。
使用@Controller
注解可以让Spring框架自动扫描并创建Controller实例,从而简化了Controller类的创建和配置。在Spring Boot中,你可以使用@Controller
注解来标记Controller类,以便让Spring Boot自动扫描并创建Controller实例。
@RequestMapping
@RequestMapping
注解是Spring框架中的一个注解,它用于映射HTTP请求到方法上。它可以指定HTTP请求的路径、请求方法、请求参数等信息。
在Spring Boot中,@RequestMapping
注解通常与@Controller
或@RestController
注解一起使用,以便将HTTP请求映射到Controller类的方法上。下面是一些常用的@RequestMapping
注解的示例:
-
@RequestMapping("/users")
:指定HTTP请求的路径为/users
,可以通过HTTP GET、POST、PUT、DELETE等方法访问。 -
@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
:指定HTTP请求的路径为/users/{id}
,可以通过HTTP GET方法访问。 -
@RequestMapping(value = "/users", method = RequestMethod.POST)
:指定HTTP请求的路径为/users
,可以通过HTTP POST方法访问。 -
@RequestMapping(value = "/users/{id}", method = RequestMethod.PUT)
:指定HTTP请求的路径为/users/{id}
,可以通过HTTP PUT方法访问。 -
@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
:指定HTTP请求的路径为/users/{id}
,可以通过HTTP DELETE方法访问。
@PathVariable
@PathVariable
注解是Spring框架中的一个注解,它用于从请求路径中获取参数值。在Spring MVC中,@PathVariable
注解通常与@RequestMapping
注解一起使用,以便将HTTP请求映射到Controller类的方法上。
使用@PathVariable
注解可以让Spring框架自动从请求路径中获取参数值,并将其绑定到方法的参数上。例如:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
}
在这个例子中,@GetMapping
注解用于指定HTTP GET请求的路径为/users/{id}
,其中{id}
表示一个动态参数。@PathVariable
注解用于将请求路径中的id
参数值绑定到getUserById
方法的id
参数上,以便查询对应的用户数据。
@ModelAttribute
@ModelAttribute
注解是Spring框架中的一个注解,它用于将请求参数绑定到Model对象上。在Spring MVC中,@ModelAttribute
注解通常与@RequestMapping
注解一起使用,以便将HTTP请求映射到Controller类的方法上。
使用@ModelAttribute
注解可以让Spring框架自动将请求参数绑定到Model对象上,并将其传递给Controller类的方法。例如:
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/register")
public String showRegistrationForm(@ModelAttribute("user") User user) {
return "registration-form";
}
@PostMapping("/register")
public String processRegistrationForm(@ModelAttribute("user") User user) {
userService.registerUser(user);
return "redirect:/users/login";
}
}
在这个例子中,@GetMapping
注解用于指定HTTP GET请求的路径为/users/register
,它的作用是显示用户注册表单。@ModelAttribute
注解用于将一个名为user
的Model对象传递给showRegistrationForm
方法,以便在表单中显示用户数据。@PostMapping
注解用于指定HTTP POST请求的路径为/users/register
,它的作用是处理用户提交的注册表单数据。@ModelAttribute
注解用于将请求参数绑定到user
对象上,以便注册用户数据。
@RequestParam
@RequestParam
注解是Spring框架中的一个注解,它用于从HTTP请求中获取参数值。在Spring MVC中,@RequestParam
注解通常与@RequestMapping
注解一起使用,以便将HTTP请求映射到Controller类的方法上。
使用@RequestParam
注解可以让Spring框架自动从HTTP请求中获取参数值,并将其绑定到方法的参数上。例如:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/search")
public List<User> searchUsers(@RequestParam("query") String query) {
return userService.searchUsers(query);
}
}
注解结合使用
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUserById(@PathVariable("id") Long id, Model model) {
User user = userService.getUserById(id);
model.addAttribute("user", user);
return "user-details";
}
@GetMapping("/search")
public String searchUsers(@ModelAttribute("query") String query,
@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "size", defaultValue = "10") int size,
Model model) {
List<User> users = userService.searchUsers(query, page, size);
model.addAttribute("users", users);
return "user-list";
}
@PostMapping("/create")
public String createUser(@ModelAttribute("user") User user) {
userService.createUser(user);
return "redirect:/users/" + user.getId();
}
}
在这个例子中,@Controller
注解用于声明这是一个Controller类。@RequestMapping
注解用于指定Controller类的根路径为/users
,它的作用是处理与用户相关的HTTP请求。@PathVariable
注解用于将HTTP请求中的路径变量id
绑定到getUserById
方法的id
参数上,以便获取指定ID的用户数据。Model
对象用于将查询结果传递给视图层,以便在用户详情页中显示用户数据。
@ModelAttribute
注解用于将一个名为query
的Model对象传递给searchUsers
方法,以便在搜索表单中显示查询条件。@RequestParam
注解用于将名为page
和size
的请求参数绑定到searchUsers
方法的page
和size
参数上,以便分页查询用户数据。Model
对象用于将查询结果传递给视图层,以便在用户列表中显示用户数据。
@PostMapping
注解用于处理HTTP POST请求,它的作用是创建新的用户数据。@ModelAttribute
注解用于将一个名为user
的Model对象传递给createUser
方法,以便获取表单提交的用户数据。userService.createUser(user)
用于将用户数据保存到数据库中。"redirect:/users/" + user.getId()
用于重定向到新创建的用户详情页。
总结
我只是列举了我使用的部分注解
这些注解使Spring Boot开发更加简单和高效,帮助开发者避免繁琐的配置和大量的样板代码,从而快速构建和部署应用程序。它们提供了便捷的方式来定义应用程序的结构、配置和行为