日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

@select注解模糊查询_mybatis @SelectProvider 注解, 打赌你没有用过

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @select注解模糊查询_mybatis @SelectProvider 注解, 打赌你没有用过 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

01、前言

為什么會寫這篇文章, 因為在看到 MapperAnnotationBuilder 構造方法初始化時, 發現了四個從未見過的注解

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

@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider

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

02、介紹篇

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

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

沒有看到這一塊的具體解析源碼, 不過也能猜出來, 根據反射調用方法獲取的返回值

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

03、實戰篇

如何根據注解定義 sql 語句呢, 首先定義 mapper 接口

public interface AutoConstructorMapper {@SelectProvider(type = SubjectSqlProvider.class, method = "getSubjectTestProvider")PrimitiveSubject getSubjectTestProvider(@Param("id") int id); } “ @Param() 為必須, 在解析時會將參數定義為 map, 進行調用指定 method

創建 type 對應的存放 sql 語句的類, 以及定義返回 sql 語句的方法

有三點需要注意:

  • 方法入參必須為 Map
  • 方法的權限修飾符 必須是 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 提供開發者在代碼中靈活編寫 sql 語句的工具類

    04、思考篇

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

    @Select 與 @SelectProvider 只是在定義注解的方式上有所不同, 一個是直接定義 sql, 一個是在外部定義好 sql 直接引用, 沒有質的區別

    在 mybatis 初始化定義 MappedStatement 時, 使用了兩種不同的邏輯進行組裝 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 的三種形式, 以及介紹不同的方式對應的使用場景

    5.1 @Select

    這種方式能夠定義簡單的 sql, 不涉及復雜查詢和多參數的場景, 類似下述方式

    @Select 定義 sql 的方式是最簡單的, 省去了定義 xml文件的繁瑣, 也少了定義編寫 @SelectProvider 對應類和方法的步驟

    SELECT * FROM subject WHERE id = #{id}

    5.2 @SelectProvider

    這種方式編寫sql適合編寫中等長度, 簡單的查詢搭配 join、group、order...

    SQL 工具類提供了這種簡單的 API 語法, 還是比較方便的

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

    5.3 .xml 文件

    這種方式就不多說了, 功能全部具備, 比如計算函數、動態SQL、各種關鍵字都支持

    這幾種方式都能夠實現我們的 sql 編寫需求, 只不過針對不同的場景, 合理的使用即可

    06、總結篇

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

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

    有什么好的源碼閱讀習慣可以點擊下方進行留言, 大家一起討論更好的學習方式 [開心]

    總結

    以上是生活随笔為你收集整理的@select注解模糊查询_mybatis @SelectProvider 注解, 打赌你没有用过的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。