最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解mybatis @SelectProvider 注解

 更新時(shí)間:2020年12月01日 14:48:11   作者:麻花不是花花  
這篇文章主要介紹了mybatis @SelectProvider 注解的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

01、前言

為什么會(huì)寫這篇文章, 因?yàn)樵诳吹?MapperAnnotationBuilder 構(gòu)造方法初始化時(shí), 發(fā)現(xiàn)了四個(gè)從未見過的注解

public MapperAnnotationBuilder(Configuration configuration, Class<?> type) {
  ...
  sqlAnnotationTypes.add(Select.class);
  sqlAnnotationTypes.add(Insert.class);
  sqlAnnotationTypes.add(Update.class);
  sqlAnnotationTypes.add(Delete.class);
  // 這四個(gè)注解眼生的很
  sqlProviderAnnotationTypes.add(SelectProvider.class);
  sqlProviderAnnotationTypes.add(InsertProvider.class);
  sqlProviderAnnotationTypes.add(UpdateProvider.class);
  sqlProviderAnnotationTypes.add(DeleteProvider.class);
}

@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider

分別是 mybatis 定義的 另類增刪改查注解

02、介紹篇

四個(gè)注解中分別都有兩個(gè)屬性, 這里以 @SelectProvider舉例

可以看到, 兩個(gè)屬性并沒有默認(rèn)值, 證明定義注解的話, 這兩個(gè)屬性必須組合使用

沒有看到這一塊的具體解析源碼, 不過也能猜出來(lái), 根據(jù)反射調(diào)用方法獲取的返回值

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface InsertProvider {
  // 用于指定獲取 sql 語(yǔ)句的指定類
  Class<?> type();
  // 指定類中要執(zhí)行獲取 sql 語(yǔ)句的方法
  String method();
}

03、實(shí)戰(zhàn)篇

如何根據(jù)注解定義 sql 語(yǔ)句呢, 首先定義 mapper 接口

public interface AutoConstructorMapper {
  @SelectProvider(type = SubjectSqlProvider.class, method = "getSubjectTestProvider")
  PrimitiveSubject getSubjectTestProvider(@Param("id") int id);
}

@Param() 為必須, 在解析時(shí)會(huì)將參數(shù)定義為 map, 進(jìn)行調(diào)用指定 method

創(chuàng)建 type 對(duì)應(yīng)的存放 sql 語(yǔ)句的類, 以及定義返回 sql 語(yǔ)句的方法

有三點(diǎn)需要注意:

  • 方法入?yún)⒈仨殲?Map
  • 方法的權(quán)限修飾符 必須是 public
  • 方法返回的必須是拼接好的 sql 字符串
public class SubjectSqlProvider {
  public String getSubjectTestProvider(Map<String, Object> params) {
    return new SQL()
        .SELECT("*")
        .FROM("subject")
        .WHERE("id = " + params.get("id"))
        .toString();
  }
}

SQL 類是 mybatis 提供開發(fā)者在代碼中靈活編寫 sql 語(yǔ)句的工具類

04、思考篇

思考一下, @SelectProvider 注解, 與 @Select 注解解析流程有什么不同?

@Select@SelectProvider 只是在定義注解的方式上有所不同, 一個(gè)是直接定義 sql, 一個(gè)是在外部定義好 sql 直接引用, 沒有質(zhì)的區(qū)別

在 mybatis 初始化定義 MappedStatement 時(shí), 使用了兩種不同的邏輯進(jìn)行組裝 SqlSource

Class<? extends Annotation> sqlAnnotationType = getSqlAnnotationType(method);
Class<? extends Annotation> sqlProviderAnnotationType = getSqlProviderAnnotationType(method);
if (sqlAnnotationType != null) {
  if (sqlProviderAnnotationType != null) {
    throw new BindingException("You cannot supply both a static SQL and SqlProvider to method named " + method.getName());
  }
  Annotation sqlAnnotation = method.getAnnotation(sqlAnnotationType);
  final String[] strings = (String[]) sqlAnnotation.getClass().getMethod("value").invoke(sqlAnnotation);
  return buildSqlSourceFromStrings(strings, parameterType, languageDriver);
} else if (sqlProviderAnnotationType != null) {
  Annotation sqlProviderAnnotation = method.getAnnotation(sqlProviderAnnotationType);
  return new ProviderSqlSource(assistant.getConfiguration(), sqlProviderAnnotation, type, method);
}

05、使用篇

這里介紹下 mybatis 具體編寫 SQL 的三種形式, 以及介紹不同的方式對(duì)應(yīng)的使用場(chǎng)景

5.1 @Select

這種方式能夠定義簡(jiǎn)單的 sql, 不涉及復(fù)雜查詢和多參數(shù)的場(chǎng)景, 類似下述方式

@Select 定義 sql 的方式是最簡(jiǎn)單的, 省去了定義 xml文件的繁瑣, 也少了定義編寫 @SelectProvider 對(duì)應(yīng)類和方法的步驟

SELECT * FROM subject WHERE id = #{id}

5.2 @SelectProvider

這種方式編寫sql適合編寫中等長(zhǎng)度, 簡(jiǎn)單的查詢搭配 join、group、order…

SQL 工具類提供了這種簡(jiǎn)單的 API 語(yǔ)法, 還是比較方便的

如果不想使用 SQL 工具類, 自己編寫 sql 字符串也是可以的

5.3 .xml 文件

這種方式就不多說了, 功能全部具備, 比如計(jì)算函數(shù)、動(dòng)態(tài)SQL、各種關(guān)鍵字都支持

這幾種方式都能夠?qū)崿F(xiàn)我們的 sql 編寫需求, 只不過針對(duì)不同的場(chǎng)景, 合理的使用即可

06、總結(jié)篇

看 mybatis 源碼, 對(duì)變量、方法的命名加深了感觸, 一個(gè)好的變量或者方法命名在代碼中是多么有必要

getSqlSourceFromAnnotations 是不是要比 getSqlSource 要好理解很多, 看了之后就能讓閱讀者知道這個(gè)方法要做什么功能

到此這篇關(guān)于詳解mybatis @SelectProvider 注解的文章就介紹到這了,更多相關(guān)mybatis @SelectProvider 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中Calendar類用法實(shí)例詳解

    java中Calendar類用法實(shí)例詳解

    這篇文章主要介紹了java中Calendar類用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Calendar類的函數(shù)、方法功能與相關(guān)使用技巧,需要的朋友可以參考下
    2017-10-10
  • Tomcat集群和Session復(fù)制應(yīng)用介紹

    Tomcat集群和Session復(fù)制應(yīng)用介紹

    本文將詳細(xì)介紹Tomcat集群和Session復(fù)制應(yīng)用,需要了解的朋友可以參考下
    2012-11-11
  • 改善Java代碼之慎用java動(dòng)態(tài)編譯

    改善Java代碼之慎用java動(dòng)態(tài)編譯

    這篇文章主要介紹了改善Java代碼之慎用java動(dòng)態(tài)編譯,需要的朋友可以參考下
    2021-04-04
  • 全面了解Java中Native關(guān)鍵字的作用

    全面了解Java中Native關(guān)鍵字的作用

    下面小編就為大家?guī)?lái)一篇全面了解Java中Native關(guān)鍵字的作用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-07-07
  • Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用

    Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用

    本文主要介紹了Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 如何更優(yōu)雅地獲取spring boot yml中的值

    如何更優(yōu)雅地獲取spring boot yml中的值

    這篇文章主要給大家介紹了關(guān)于如何更優(yōu)雅地獲取spring boot yml中值的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SpringSecurity自定義Form表單使用方法講解

    SpringSecurity自定義Form表單使用方法講解

    這篇文章主要介紹了Spring Security自定義Form表單使用方法,雖然 Spring Security 提供了默認(rèn)的登錄表單,實(shí)際項(xiàng)目里肯定是不可以直接使用的,當(dāng)然 Spring Security 也提供了自定義登錄表單的功能
    2023-01-01
  • Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案

    Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案

    實(shí)體類中有一個(gè) List<String> 類型的屬性,對(duì)應(yīng)于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查詢時(shí)能互相轉(zhuǎn)換,本文給大家介紹Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案,需要的朋友可以參考下
    2024-06-06
  • iReport簡(jiǎn)單使用方法圖文教程

    iReport簡(jiǎn)單使用方法圖文教程

    iReport是一個(gè)能夠創(chuàng)建復(fù)雜報(bào)表的開源項(xiàng)目,它100%使用Java語(yǔ)言編寫,是目前全球最為流行的開源報(bào)表設(shè)計(jì)器,由于它豐富的圖形界面,你能夠很快的創(chuàng)建出任何一種你想要的報(bào)表
    2021-10-10
  • Java中圖片轉(zhuǎn)換為Base64的示例及注意事項(xiàng)

    Java中圖片轉(zhuǎn)換為Base64的示例及注意事項(xiàng)

    本文介紹了Base64編碼的概念及其作用,同時(shí)列舉了在實(shí)現(xiàn)圖片轉(zhuǎn)換為Base64過程中需要注意的問題,包括文件大小、讀取異常、圖片格式、網(wǎng)絡(luò)傳輸效率以及數(shù)據(jù)安全性等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10

最新評(píng)論

郯城县| 淳安县| 特克斯县| 宜川县| 安多县| 大埔区| 交口县| 江山市| 始兴县| 九龙城区| 仙游县| 阳高县| 乌拉特后旗| 沾化县| 富宁县| 宕昌县| 额尔古纳市| 偃师市| 四子王旗| 乌海市| 财经| 乌恰县| 巴东县| 巨鹿县| 万山特区| 两当县| 泸溪县| 耿马| 襄城县| 桦川县| 和平区| 和顺县| 平谷区| 德化县| 古浪县| 拜城县| 禹州市| 大理市| 隆德县| 云南省| 陇川县|