Java常見(jiàn)注解及其使用匯總

1. springboot項(xiàng)目注解

1. 啟動(dòng)注解@SpringBootApplication

1. @SpringBootApplication 注解
SpringBoot最核心的注解,用于SpringBoot的主類,標(biāo)識(shí)這是一個(gè) SpringBoot 應(yīng)用,用來(lái)開(kāi)啟 Spring Boot 的各項(xiàng)能力。
是 @SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三個(gè)注解的組合。由于這些注解一般一起使用,所以干脆整合成了一個(gè)統(tǒng)一的注解@SpringBootApplication。
2. @SpringBootConfiguration 注解
繼承@Configuration注解,主要用于加載配置文件,二者功能致,標(biāo)注當(dāng)前類為配置類, 將當(dāng)前類內(nèi)聲明的一個(gè)或多個(gè)以@Bean注解標(biāo)記的方法的實(shí)例納入到spring容器中,且實(shí)例名為方法名。
3. @EnableAutoConfiguration 注解
開(kāi)啟自動(dòng)配置功能,幫助SpringBoot應(yīng)用將所有符合條件的@Configuration配置都加載到當(dāng)前SpringBoot創(chuàng)建并使用的IoC容器。智能的自動(dòng)配置功效借助于Spring框架原有的一個(gè)工具類:SpringFactoriesLoader的支持。
4. @ComponentScan注解
主要用于組件掃描和自動(dòng)裝配,自動(dòng)掃描并加載符合條件的組件或bean定義,最終將這些bean定義加載到容器中??梢酝ㄟ^(guò)basePackages等屬性指定@ComponentScan自動(dòng)掃描的范圍,若不指定,則Spring框架實(shí)現(xiàn)默認(rèn)從聲明@ComponentScan所在類的package進(jìn)行掃描,SpringBoot的啟動(dòng)類最好放在root package下。

2. 配置文件相關(guān)注解

1. @Configuration
用于定義配置類,指出該類是 Bean 配置的信息源,相當(dāng)于傳統(tǒng)的xml配置文件,一般加在主類上。如果有些第三方庫(kù)需要用到xml文件,建議仍然通過(guò)@Configuration類作為項(xiàng)目的配置主類——可以使用@ImportResource注解加載xml配置文件。
2. @ComponentScan
組件掃描。讓spring Boot掃描到Configuration類并把它加入到程序上下文。@ComponentScan注解默認(rèn)就會(huì)裝配標(biāo)識(shí)了@Controller,@Service,@Repository,@Component注解的類到spring容器中。

3. controller層相關(guān)注解

1. RestController 復(fù)合注解
@RestController注解= @ResponseBody+@Controller,效果是將方法返回的對(duì)象直接在瀏覽器上展示成json格式。用于標(biāo)記控制器類,表示該類是一個(gè)RESTful風(fēng)格的控制器,用于API的請(qǐng)求和響應(yīng)
2. @ResponseBody 注解
@ResponseBody這個(gè)注解通常使用在控制層(controller)的方法上,其作用是將方法的返回值以特定的格式寫(xiě)入到response的body區(qū)域,進(jìn)而將數(shù)據(jù)返回給客戶端。當(dāng)方法上面沒(méi)有寫(xiě)ResponseBody,底層會(huì)將方法的返回值封裝為ModelAndView對(duì)象。
是字符串則直接將字符串寫(xiě)到客戶端。
是一個(gè)對(duì)象,此時(shí)會(huì)將對(duì)象轉(zhuǎn)化為json串然后寫(xiě)到客戶端。這里需要注意的是,如果返回對(duì)象,按utf-8編碼。如果返回String,默認(rèn)按iso8859-1編碼,頁(yè)面可能出現(xiàn)亂碼。因此在注解中我們可以手動(dòng)修改編碼格式,比如@RequestMapping(value=“/cat/query”,produces=“text/html;charset=utf-8”),前面是請(qǐng)求的路徑,后面是編碼格式。
轉(zhuǎn)化為json格式的字符串是通過(guò)HttpMessageConverter中的方法實(shí)現(xiàn)的,因?yàn)樗且粋€(gè)接口,因此由其實(shí)現(xiàn)類完成轉(zhuǎn)換。如果是bean對(duì)象,會(huì)調(diào)用對(duì)象的getXXX()方法獲取屬性值并且以鍵值對(duì)的形式進(jìn)行封裝,進(jìn)而轉(zhuǎn)化為json串。如果是map集合,采用get(key)方式獲取value值,然后進(jìn)行封裝。
一般在異步獲取數(shù)據(jù)時(shí)使用,在使用@RequestMapping 后,返回值通常解析為跳轉(zhuǎn)路徑,加上@responsebody 后返回結(jié)果不會(huì)被解析為跳轉(zhuǎn)路徑,而是直接寫(xiě)入 HTTP response body 中。比如異步獲取json 數(shù)據(jù),加上 @responsebody 后,會(huì)直接返回 json 數(shù)據(jù)。
3. @Controller 注解
用于標(biāo)注控制層。這里控制層里面的每個(gè)方法,都可以去調(diào)用@Service標(biāo)識(shí)的類(業(yè)務(wù)邏輯層),
@Service標(biāo)識(shí)的類中的方法可以繼續(xù)調(diào)用@Resposity標(biāo)識(shí)的接口實(shí)現(xiàn)類(Dao層/持久層)。用的較少,都是直接使用@RestController
4.  @RequestBody
通過(guò)HttpMessageConverter讀取Request Body并反序列化為Object(泛指)對(duì)象
@RequestBody主要用來(lái)接收前端傳遞給后端的json字符串中的數(shù)據(jù)的(請(qǐng)求體中的數(shù)據(jù)的);而最常用的使用請(qǐng)求體傳參是POST請(qǐng)求,所以使用@RequestBody接收數(shù)據(jù)時(shí),一般都用POST方式進(jìn)行提交。在后端的同一個(gè)接收方法里,@RequestBody與@RequestParam可以同時(shí)使用,@RequestBody最多只能有一個(gè),而@RequestParam可以有多個(gè)。
需要注意的是,使用@RequestBody注解時(shí),請(qǐng)求的Content-Type必須為application/json或application/xml,以確保請(qǐng)求體的數(shù)據(jù)能夠正確地被解析和綁定到對(duì)應(yīng)的Java對(duì)象上。
5. @RequestParam
@RequestParam注解用于從請(qǐng)求的URL或表單中獲取參數(shù)的值。它通常用于處理GET請(qǐng)求中的請(qǐng)求參數(shù),并將參數(shù)的值綁定到方法的參數(shù)上。簡(jiǎn)單來(lái)說(shuō),當(dāng)我們需要獲取URL中的參數(shù)或表單中的參數(shù)時(shí),就可以使用@RequestParam注解。
總結(jié):
@RequestBody主要用于處理請(qǐng)求體中的數(shù)據(jù),適用于POST請(qǐng)求;而@RequestParam主要用于處理URL或表單中的參數(shù),適用于GET請(qǐng)求。簡(jiǎn)單來(lái)說(shuō),@RequestBody注解用于獲取請(qǐng)求體中的數(shù)據(jù),@RequestParam注解用于獲取URL或表單中的參數(shù)。
6. PathVariable 注解
用于從URL路徑中提取參數(shù),將URL的一部分綁定到處理方法的參數(shù)上。
RequestParam的參數(shù)是以參數(shù)拼接形式拼接在地址后面,
例如: http://127.0.0.1:8080/test?id=1
PathVariable則是從路徑中的一部分提取
例如:http://127.0.0.1:8080/test/1 
通過(guò)@RequestMapping("test/{id}")解析路徑中test后面的為參數(shù)
7. RequestMapping 
用于映射請(qǐng)求路徑和HTTP方法到相應(yīng)的處理方法,指定URL路徑和請(qǐng)求方法,支持類級(jí)別和方法級(jí)別。
將 HTTP 請(qǐng)求映射到 MVC 和 REST 控制器的處理方法上,提供路由信息,負(fù)責(zé)URL到Controller中的具體函數(shù)的映射。
@GetMapping是組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫(xiě)。
@PostMapping是組合注解,是@RequestMapping(method = RequestMethod.POST)的縮寫(xiě)。
其他delete、put方法等類似。
8. @RequestHeader
把Request請(qǐng)求header部分的值綁定到方法的參數(shù)上,用的較少
9. @CookieValue
把Request header中關(guān)于cookie的值綁定到方法的參數(shù)上,用的較少
10. @Value
注入 application.properties 或 application.yml 配置的屬性的值;

4. 注入bean相關(guān)

1. @Bean
用于標(biāo)記方法,該方法返回的對(duì)象將被注冊(cè)為一個(gè)bean,并由Spring容器進(jìn)行管理
2. @Component
通用的Spring組件注解,表示這個(gè)類是一個(gè)可被Spring容器托管的組件。
在類路徑掃描期間找到裝飾有@Component的 Java 類,并在上下文中注冊(cè)為 Bean。也泛指各種組件,就是說(shuō)當(dāng)我們的類不屬于各種歸類的時(shí)候(不屬于@Controller、@Services等的時(shí)候),使用@Component來(lái)標(biāo)注這個(gè)類。
3. @Controller
同上,用于標(biāo)注控制層
4. @Service
用于標(biāo)記業(yè)務(wù)層的類,表示該類是一個(gè)服務(wù)類。
@Component注解的一個(gè)特例,作用在類上,使用注解配置和類路徑掃描時(shí),被@Service注解標(biāo)注的類會(huì)被Spring掃描并注冊(cè)為Bean,用于標(biāo)注服務(wù)層組件,表示定義一個(gè)bean
注解作用域默認(rèn)單例
使用時(shí)沒(méi)有傳參數(shù),Bean名稱默認(rèn)為當(dāng)前類的類名,首字母小寫(xiě)
@Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用時(shí)傳參數(shù),使用value作為Bean名字
5. @Repository
標(biāo)識(shí)為DAO層,通常要配合@MapperScannerConfigurer使用,配置掃描地址
6. @Mapper
@Mapper注解是由Mybatis框架中定義的一個(gè)描述數(shù)據(jù)層接口的注解,即dao層開(kāi)發(fā)。注解往往起到的都是一個(gè)描述性作用,用于告訴sprigng框架此接口的實(shí)現(xiàn)類由Mybatis負(fù)責(zé)創(chuàng)建,并將其實(shí)現(xiàn)類對(duì)象存儲(chǔ)到spring容器中。
作用就是將一個(gè)接口或類標(biāo)識(shí)為MyBatis的Mapper,并實(shí)現(xiàn)了數(shù)據(jù)庫(kù)操作的功能,簡(jiǎn)化了編寫(xiě)和配置數(shù)據(jù)訪問(wèn)層的代碼。
7. @Autowired
自動(dòng)導(dǎo)入
@Autowired注解作用在構(gòu)造函數(shù)、方法、方法參數(shù)、類字段以及注解上
@Autowired注解可以實(shí)現(xiàn)Bean的自動(dòng)注入
8. @Entity
實(shí)體類注解
@Table(name =“數(shù)據(jù)庫(kù)表名”),這個(gè)注解也注釋在實(shí)體類上,對(duì)應(yīng)數(shù)據(jù)庫(kù)中相應(yīng)的表。
@Id、@Column注解用于標(biāo)注實(shí)體類中的字段,pk字段標(biāo)注為@Id,其余@Column。
9. @Qualifier
當(dāng)有多個(gè)同一類型的Bean時(shí),可以用@Qualifier(“name”)來(lái)指定。與@Autowired配合使用
10. @Scope作用域注解
@Scope在和@Component注解一起修飾在類上,作為類級(jí)別注解時(shí),@Scope表示該類實(shí)例的范圍
在和@Bean一起修飾在方法上,作為方法級(jí)別注解時(shí),@Scope表示該方法返回的實(shí)例的范圍。
對(duì)于@Scope注解,我們常用的屬性一般就是:value和proxyMode,value就是指明作用域范圍,proxyMode指明哪種作用域代理。
value
    singleton   表示該bean是單例的。(默認(rèn))
    prototype   表示該bean是多例的,即每次使用該bean時(shí)都會(huì)新建一個(gè)對(duì)象。
    request     在一次http請(qǐng)求中,一個(gè)bean對(duì)應(yīng)一個(gè)實(shí)例。
    session     在一個(gè)httpSession中,一個(gè)bean對(duì)應(yīng)一個(gè)實(shí)例。
proxyMode
    DEFAULT         不使用代理。(默認(rèn))
    NO              不使用代理,等價(jià)于DEFAULT。
    INTERFACES      使用基于接口的代理(jdk dynamic proxy)。
    TARGET_CLASS    使用基于類的代理(cglib)。

5. 事務(wù)

七、事務(wù)注解 @Transactional
在Spring中,事務(wù)有兩種實(shí)現(xiàn)方式,分別是編程式事務(wù)管理和聲明式事務(wù)管理兩種方式
編程式事務(wù)管理: 編程式事務(wù)管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對(duì)于編程式事務(wù)管理,spring推薦使用TransactionTemplate。
聲明式事務(wù)管理: 建立在AOP之上的。其本質(zhì)是對(duì)方法前后進(jìn)行攔截,然后在目標(biāo)方法開(kāi)始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù),通過(guò)@Transactional就可以進(jìn)行事務(wù)操作,更快捷而且簡(jiǎn)單。推薦使用

2. 校驗(yàn)相關(guān)注解合集

1. @NotNull
適用對(duì)象:任何類型。
注解作用:校驗(yàn)對(duì)象不能為null
2. @NotEmpty
適用對(duì)象: String、集合、數(shù)組、Map、鏈表List。
注解作用:不能為null,不能是空字符,集合、數(shù)組、map等size()不能為0;字符串trim()后可以等于“”
3. @NotBlank
適用對(duì)象:字符串。
注解作用:檢查字符串是否不為空,并且長(zhǎng)度大于0。
4. @Min
適用對(duì)象:數(shù)字類型、數(shù)字字符串。
注解作用:限定數(shù)字的最小值(整型)。
5. @Max
適用對(duì)象:數(shù)字類型、數(shù)字字符串。
注解作用:限定數(shù)字的最大值(整型)。
6. @DecimalMin 
適用對(duì)象:數(shù)字類型、數(shù)字字符串。
注解作用:限定數(shù)字的最小值(可以是小數(shù))。
7. @DecimalMax 
適用對(duì)象:數(shù)字類型、數(shù)字字符串。
注解作用:限定數(shù)字的最大值(可以是小數(shù))。
8. @Range
適用對(duì)象:數(shù)字類型、數(shù)字字符串。
注解作用:限定對(duì)象的數(shù)字值要在一個(gè)合理的區(qū)域范圍內(nèi)
9. @Length
適用對(duì)象:字符串。
注解作用:限定字符串的長(zhǎng)度最大值、最小值
10. @Size
適用對(duì)象: 集合、數(shù)組、字符串、Map等
注解作用: 校驗(yàn)對(duì)象的長(zhǎng)度或尺寸大小在設(shè)置的最小、最大值區(qū)間內(nèi)
需要注意的是,對(duì)于集合和字符串類型,@Size注解校驗(yàn)的是元素的個(gè)數(shù)或字符串的長(zhǎng)度;對(duì)于數(shù)組和Map類型,@Size注解校驗(yàn)的是數(shù)組的長(zhǎng)度或Map的大小,而非元素個(gè)數(shù)。
11. @Pattern
適用對(duì)象:字符串
注解作用:正則匹配該字符串
12. @Email
適用對(duì)象:字符串
注解作用:字符串必須滿足郵箱的正則格式
13. @AssertTrue  
適用對(duì)象:Boolean,
注解作用:布爾屬性必須是true
14. @AssertFalse  
適用對(duì)象:Boolean,
注解作用:布爾屬性必須是false
15. @Digits(integer,fraction) 
適用對(duì)象: 小數(shù)
注解作用: 整數(shù)部分的位數(shù)不能超過(guò)integer,小數(shù)部分的位數(shù)不能超過(guò)fraction
16. @Future
適用對(duì)象: 日期Date
注解作用:限制必須是一個(gè)將來(lái)的日期
16. @Past 
適用對(duì)象: 日期Date
注解作用:限制必須是一個(gè)過(guò)去的日期

3. swagger相關(guān)注解

1. @Api

Api 用在類上,說(shuō)明該類的作用。可以標(biāo)記一個(gè)Controller類做為swagger 文檔資源,用于對(duì)整個(gè)API文檔進(jìn)行說(shuō)明,包括API的描述、作者、版本等信息。

@Api(tags = "用戶管理", description = "用戶管理操作相關(guān)Api接口")
@RestController
@RequestMapping("/user")
public class UserController {
    // ...
}

2. @ApiOperation

@ApiOperation用在請(qǐng)求方法上,說(shuō)明該方法的作用。用于對(duì)某個(gè)具體的API接口進(jìn)行說(shuō)明,包括接口的描述、請(qǐng)求方法、請(qǐng)求路徑等信息

@GetMapping("/{id}")
@ApiOperation(value = "獲取用戶信息", notes = "根據(jù)用戶ID獲取用戶詳細(xì)信息", httpMethod = "POST")
public User getUserById(@PathVariable Long id){
    // ...
}

3. @ApiParam

用于對(duì)API接口的參數(shù)進(jìn)行說(shuō)明,包括參數(shù)的名稱、類型、描述等信息。

@PostMapping("/create")
@ApiOperation(value = "創(chuàng)建用戶", notes = "根據(jù)用戶信息創(chuàng)建新用戶")
public User createUser(
    @ApiParam(name = "user", value = "用戶對(duì)象", required = true) @RequestBody User user){
    // ...
}

4. @ApiModel

用于對(duì)數(shù)據(jù)模型進(jìn)行說(shuō)明,包括模型的名稱、描述等信息。一般用在實(shí)體上。

@ApiModel(value = "用戶對(duì)象", description = "用戶對(duì)象詳細(xì)信息")
public class User {
    // ...
}

5. @ApiModelProperty

用于對(duì)數(shù)據(jù)模型的屬性進(jìn)行說(shuō)明,包括屬性的名稱、類型、描述等信息。
一般用于解釋實(shí)體內(nèi)某個(gè)屬性的含義

@ApiModel(value = "用戶對(duì)象", description = "用戶對(duì)象詳細(xì)信息")
public class User {
    @ApiModelProperty(value = "用戶ID", example = "1")
    private Long id;
    
    @ApiModelProperty(value = "用戶名", example = "John")
    private String username;
    // ...
}

6. @ApiResponse

用于對(duì)API接口的響應(yīng)進(jìn)行說(shuō)明,包括響應(yīng)的狀態(tài)碼、描述等信息。

@GetMapping("/{id}")
@ApiOperation(value = "獲取用戶信息", notes = "根據(jù)用戶ID獲取用戶詳細(xì)信息")
@ApiResponse(code = 200, message = "請(qǐng)求成功", response = User.class)
public User getUserById(@PathVariable Long id){
    // ...
}

7. @ApiResponses

用于對(duì)API接口的多個(gè)響應(yīng)進(jìn)行說(shuō)明,可以嵌套多個(gè)@ApiResponse注解。

@GetMapping("/{id}")
@ApiOperation(value = "獲取用戶信息", notes = "根據(jù)用戶ID獲取用戶詳細(xì)信息")
@ApiResponses({
    @ApiResponse(code = 200, message = "請(qǐng)求成功", response = User.class),
    @ApiResponse(code = 401, message = "未授權(quán)"),
    @ApiResponse(code = 403, message = "禁止訪問(wèn)"),
    @ApiResponse(code = 404, message = "未找到資源")
})
public User getUserById(@PathVariable Long id){
    // ...
}

8. @ApiIgnore

用于指定不在Swagger文檔中顯示的API接口??梢院雎圆糠諥PI接口,與@Api同層級(jí)

@GetMapping("/{id}")
@ApiIgnore
public void ignoreApi(){
    // ...
}

9. @ApiImplicitParam

用于對(duì)API接口的參數(shù)進(jìn)行說(shuō)明,包括參數(shù)的名稱、類型、描述等信息,與@ApiParam類似,但用于指定非@RequestParam注解的參數(shù)

@PostMapping("/upload")
@ApiOperation(value = "上傳文件", notes = "上傳文件接口")
@ApiImplicitParams({
    @ApiImplicitParam(name = "file", value = "文件", required = true, dataType = "MultipartFile")
})
public void uploadFile(@RequestParam("file") MultipartFile file){
    // ...
}

10. @ApiImplicitParams

用于對(duì)API接口的多個(gè)參數(shù)進(jìn)行說(shuō)明,可以嵌套多個(gè)@ApiImplicitParam注解

@PostMapping("/create")
@ApiOperation(value = "創(chuàng)建用戶", notes = "根據(jù)用戶信息創(chuàng)建新用戶")
@ApiImplicitParams({
    @ApiImplicitParam(name = "username", value = "用戶名", required = true, dataType = "String"),
    @ApiImplicitParam(name = "password", value = "密碼", required = true, dataType = "String"),
    // ...
})
public void createUser(@RequestParam("username") String username, @RequestParam("password") String password){
    // ...
}

11、@ApiOperationSupport

用于對(duì)API接口的特殊操作進(jìn)行說(shuō)明,比如文件上傳、請(qǐng)求體為多個(gè)實(shí)體等

@PostMapping("/upload")
@ApiOperation(value = "上傳文件", notes = "上傳文件接口")
@ApiOperationSupport(
    consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
    parameters = {
        @DynamicParameters(name = "file", value = "文件", dataTypeClass = MultipartFile.class)
    }
)
public void uploadFile(@RequestPart("file") MultipartFile file){
    // ...
}

4. mybatis相關(guān)

1. @Mapper
標(biāo)識(shí)當(dāng)前為mapper層,不可缺少,否則springboot則找不到該mapper文件;在接口上使用該注解,表示該接口是一個(gè)MyBatis的Mapper接口,可以方便地進(jìn)行SQL操作。
@Mapper
public interface UserMapper {
    //...
}

2. @Param
標(biāo)識(shí)參數(shù),用于給SQL語(yǔ)句中的參數(shù)命名,方便傳入多個(gè)參數(shù),不對(duì)參數(shù)進(jìn)行注釋,可能會(huì)導(dǎo)致執(zhí)行xml中sql語(yǔ)句時(shí)找不到對(duì)應(yīng)參數(shù)
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
User getUserByNameAndAge(@Param("name") String name, @Param("age") int age);

以下注解使用較少,不推薦直接在mapper層通過(guò)注解形式書(shū)寫(xiě)sql
3. @Select
用于聲明一個(gè)查詢操作的SQL語(yǔ)句。
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);

4. @Update
用于聲明一個(gè)更新操作的SQL語(yǔ)句。
@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
int updateUser(User user);

5. @Delete
用于聲明一個(gè)刪除操作的SQL語(yǔ)句。
@Delete("DELETE FROM users WHERE id = #{id}")
int deleteUserById(int id);

6. @ResultMap
用于將查詢結(jié)果映射到對(duì)象上。
@Select("SELECT * FROM users")
@ResultMap("userResultMap")
List<User> getUsers();

@ResultMap("userResultMap")
User getUserById(int id);

<resultMap id="userResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
</resultMap>

mybatis的注解形式書(shū)寫(xiě)的sql語(yǔ)句為什么不被推薦,還是更多的使用xml?
以下是GPT的回答

盡管MyBatis提供了注解形式書(shū)寫(xiě)SQL語(yǔ)句的功能,但是在實(shí)際使用中,更多的人還是傾向于使用XML形式的配置。以下是一些原因:

1. 分離SQL和Java代碼:使用XML配置可以將SQL語(yǔ)句和Java代碼分離,使得維護(hù)更加清晰和可讀。而注解形式需要將SQL直接寫(xiě)在Java代碼中,使得代碼變得冗長(zhǎng)和難以維護(hù)。

2. 動(dòng)態(tài)SQL支持:XML配置可以使用MyBatis提供的動(dòng)態(tài)SQL功能,通過(guò)使用if、choose、when等標(biāo)簽可以實(shí)現(xiàn)靈活的條件判斷和動(dòng)態(tài)拼接SQL語(yǔ)句。而注解形式的SQL語(yǔ)句難以實(shí)現(xiàn)復(fù)雜的動(dòng)態(tài)SQL。

3. 可重用性:XML配置中的SQL語(yǔ)句可以被多個(gè)Mapper接口和方法共享,提高了SQL語(yǔ)句的可重用性。而注解形式的SQL語(yǔ)句必須在每個(gè)Mapper接口中單獨(dú)定義,導(dǎo)致SQL重復(fù)的問(wèn)題。

4. 防止SQL注入:使用XML配置的方式可以使用MyBatis的參數(shù)處理器進(jìn)行參數(shù)的轉(zhuǎn)義和防止SQL注入。而注解形式的SQL語(yǔ)句則需要手動(dòng)進(jìn)行參數(shù)處理,容易忽略防止SQL注入的措施。

盡管使用XML形式配置SQL語(yǔ)句需要更多的編寫(xiě)和配置工作,但它提供了更靈活、可維護(hù)和可重用的方式來(lái)定義和管理SQL。所以,大部分情況下,MyBatis還是更推薦使用XML形式的配置來(lái)編寫(xiě)SQL語(yǔ)句。
但是對(duì)于一些簡(jiǎn)單的SQL操作,注解形式也可以是一個(gè)方便的選擇。

5. lombok相關(guān)

使用Lombok可以大大減少編寫(xiě)樣板代碼的工作量,使得代碼更加簡(jiǎn)潔和可讀性。
需要注意的是,使用Lombok的項(xiàng)目需要在編譯時(shí)依賴Lombok插件,以確保注解生效。

1. @Getter / @Setter
自動(dòng)生成屬性的getter/setter方法。
2. @ToString
自動(dòng)生成toString方法。
3. @EqualsAndHashCode
自動(dòng)生成equals和hashCode方法。
4. @NoArgsConstructor / @AllArgsConstructor
自動(dòng)生成無(wú)參構(gòu)造方法/全參構(gòu)造方法。
5. @Data
包含了@Getter、@Setter、@ToString、@EqualsAndHashCode和@NoArgsConstructor注解的組合
6. @Builder
生成一個(gè)建造者模式的構(gòu)造器

6. EasyExcel注解

EasyExcel官網(wǎng)

1. @ExcelProperty
標(biāo)記需要導(dǎo)出的實(shí)體類中的某個(gè)字段,設(shè)定表頭的列名,導(dǎo)出順序等等
public static class User {
    @ExcelProperty("用戶姓名")
    private String username;

    @ExcelProperty("用戶性別")
    private String gender;

    @ExcelProperty("用戶年齡")
    private int age;

    @ExcelProperty("用戶電話號(hào)碼")
    private String phoneNumber;

    // 省略構(gòu)造方法、Getter和Setter
}

2. @ExcelIgnore
用于標(biāo)記忽略某個(gè)字段,不進(jìn)行Excel讀寫(xiě)操作。
public static class User {
    @ExcelProperty("用戶姓名")
    private String username;

    @ExcelProperty("用戶性別")
    private String gender;

    @ExcelProperty("用戶年齡")
    private int age;

    @ExcelIgnore
    private String phoneNumber;

    // 省略構(gòu)造方法、Getter和Setter
}

3. @ExcelIgnoreUnannotated
用于標(biāo)記在讀取Excel時(shí)忽略未注解的字段。默認(rèn)沒(méi)有標(biāo)注@ExcelIgnore的字段也會(huì)被處理,加上了則不會(huì)。
@ExcelIgnoreUnannotated
public static class User {
    @ExcelProperty("用戶姓名")
    private String username;

    @ExcelProperty("用戶性別")
    private String gender;

    @ExcelProperty("用戶年齡")
    private int age;
    
    //該字段不會(huì)再被讀寫(xiě)
    private String phoneNumber;

    // 省略構(gòu)造方法、Getter和Setter
}

4. @ExcelPropertyIndex
指定屬性在Excel中的列序號(hào),用于解析導(dǎo)入Excel數(shù)據(jù)。
也可直接使用@ExcelProperty(index = 1)
public class User {
    @ExcelPropertyIndex(index = 0) // 將name屬性與Excel文件的第一列進(jìn)行映射
    private String name;
    
    @ExcelPropertyIndex(index = 1) // 將age屬性與Excel文件的第二列進(jìn)行映射
    private int age;
    
    // 省略getter和setter方法
}

5. @ExcelHeadRowNumber 
指定表頭行號(hào),用于解析導(dǎo)入Excel數(shù)據(jù)。

6. @ColumnWidth(25)
設(shè)置列寬

7. @ContentRowHeight(10)
設(shè)置內(nèi)容行高度

8. @HeadRowHeight(20)
設(shè)置表頭高度

更多詳細(xì)注解參考EasyExcel官網(wǎng)示例。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 介紹 什么是Swagger Swagger是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)...
    TurboSnail閱讀 3,608評(píng)論 0 4
  • 用在類上: @Api() 用在類上,說(shuō)明類得作用(標(biāo)識(shí)這個(gè)類是swagger得資源) tags:表說(shuō)明 va...
    煙涼樓亭雨閱讀 2,094評(píng)論 0 0
  • Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)??傮w目...
    acc8226閱讀 1,670評(píng)論 0 1
  • swagger常用到的注解有: Api ApiModel ApiModelProperty ApiOperatio...
    Youcan_〇閱讀 1,744評(píng)論 0 2
  • @PostMapping 對(duì)應(yīng)接收參數(shù)的注解:@RequestBody解釋:一個(gè)類的時(shí)候,或者你不想你的參數(shù)直觀的...
    10676閱讀 465評(píng)論 0 1

友情鏈接更多精彩內(nèi)容