日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解mybatis @SelectProvider 注解

瀏覽:26日期:2023-10-21 08:39:17
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 字符串也是可以的

詳解mybatis @SelectProvider 注解

5.3 .xml 文件

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

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

06、總結篇

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

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

到此這篇關于詳解mybatis @SelectProvider 注解的文章就介紹到這了,更多相關mybatis @SelectProvider 注解內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美不卡| 日本美女一区| 免费精品视频| 性一交一乱一区二区洋洋av| 中文在线一区| 综合国产精品| 欧美中文高清| 麻豆免费精品视频| 国产一区二区三区天码| 国产成年精品| 精品国产乱码久久久久久1区2匹| 免费在线成人| av资源中文在线| 欧美色图国产精品| 国产精品日本| 婷婷亚洲精品| 91嫩草精品| 老司机免费视频一区二区三区| 欧美经典一区| 蜜臀国产一区| 欧美一区二区三区高清视频| 一本色道精品久久一区二区三区| 一本一道久久a久久| 国产探花一区在线观看| 国产精品a久久久久| 精品精品久久| re久久精品视频| 日本vs亚洲vs韩国一区三区二区| 国产精品对白久久久久粗| 欧美片第1页| 免播放器亚洲| 美女久久久精品| 亚洲高清毛片| 欧美一区网站| 日韩欧美视频专区| 免费在线观看成人| 国产精品入口久久| 中文字幕系列一区| 亚洲精品日韩久久| 成人影视亚洲图片在线| 九色porny丨国产首页在线| 美女精品在线| 欧美激情日韩| 亚洲激情五月| 国产精品一区高清| 久久中文字幕av| 日韩欧美中文在线观看| 国产精品精品国产一区二区| 亚洲大全视频| 免费在线成人| 国产视频一区免费看| 国产午夜久久av| 亚洲高清激情| 国产精品伦一区二区| 欧美午夜精品一区二区三区电影| 免费成人av在线播放| 你懂的网址国产 欧美| 午夜国产一区二区| 国产精品theporn| 亚洲综合不卡| 高清在线一区| 免费欧美日韩| 亚洲深夜视频| 日韩av黄色在线| 激情欧美日韩一区| 国产精品成人3p一区二区三区| 亚洲精品小说| 国产一区二区三区久久| 中文字幕免费一区二区| 午夜av成人| 国产日韩免费| 另类激情亚洲| 91精品xxx在线观看| 欧美日韩一区二区三区在线电影| 狠狠爱www人成狠狠爱综合网| 久久99影视| 亚洲精品字幕| 黄色成人精品网站| 三级在线看中文字幕完整版| 国产一级成人av| 在线亚洲精品| 偷拍精品精品一区二区三区| 日韩三级视频| 香蕉精品视频在线观看| 国产成人1区| 日韩国产精品久久久| 亚洲a一区二区三区| 麻豆国产精品一区二区三区| 日韩av中文字幕一区二区| 好看不卡的中文字幕| 日韩欧美二区| 久久99偷拍| 日韩av不卡一区二区| 夜夜嗨av一区二区三区网站四季av| 国产一区二区三区四区五区传媒 | 亚洲综合日韩| 日韩精品网站| 国产黄大片在线观看| 日韩精品高清不卡| 亚洲一区二区毛片| 欧美中文字幕一区二区| 精品视频在线一区二区在线| 91欧美日韩在线| 在线免费观看亚洲| 欧美日韩国产探花| 久久久夜精品| 中文字幕系列一区| 国产精品久久久久久久久妇女| 国产精品日韩精品在线播放| 欧美亚洲专区| 日本aⅴ免费视频一区二区三区| 水蜜桃久久夜色精品一区的特点| 国产精品88久久久久久| 日韩精品不卡一区二区| 97精品中文字幕| 亚洲国产成人二区| 欧美黑人做爰爽爽爽| 国产乱码精品| 欧美日韩a区| 欧美日一区二区三区在线观看国产免| 亚洲精品在线a| 亚洲精品系列| 亚洲精品乱码久久久久久蜜桃麻豆| 免播放器亚洲| 亚洲欧美日韩精品一区二区| 欧美日韩国产在线观看网站| 久久高清免费| 狠狠爱www人成狠狠爱综合网| 国产传媒av在线| 国产黄大片在线观看| а√天堂8资源在线| 在线看片国产福利你懂的| 国产suv精品一区| 欧美国产小视频| 日韩欧美自拍| 欧美日韩一区二区综合 | 中文字幕日韩欧美精品高清在线| 亚洲三级精品| 国产亚洲久久| 久久精品人人| 精品一区二区三区中文字幕视频| 欧美国产日本| 97国产精品| 在线成人直播| 综合一区二区三区| 亚洲精品动态| 国产精品一区三区在线观看| 久久精品一区二区国产| 日本一区二区高清不卡| 久久激情一区| 一区二区电影在线观看| 欧美日韩va| 裤袜国产欧美精品一区| 婷婷亚洲综合| 日韩1区2区3区| 国产精品va| 秋霞国产精品| 伊人www22综合色| 国产精品videossex久久发布 | 亚洲欧美激情诱惑| 欧美一区精品| 麻豆网站免费在线观看| 久久要要av| 日韩精品一页| 久久电影tv| 久热综合在线亚洲精品| 国产精品视频一区视频二区| 亚洲免费福利| 亚洲一区日本| 国产精品一站二站| 久久狠狠婷婷| 婷婷综合一区| 欧美三区四区| 日日夜夜免费精品视频| 粉嫩av一区二区三区四区五区 | 电影91久久久| 欧美专区在线| 国产精品mm| 国户精品久久久久久久久久久不卡 | 日韩免费一区| 热久久国产精品| 精品在线网站观看| 欧美中文字幕一区二区| 日韩av网站在线观看| 日韩电影免费在线观看| 久久国产精品亚洲77777| 久久中文字幕导航| 影音先锋国产精品| 免费在线亚洲欧美| 日韩午夜免费| 久久精品三级| 亚洲精品极品| 99精品在线| 国产激情一区| 亚洲欧美日韩在线观看a三区| 麻豆国产精品视频| 亚洲欧美日韩国产一区二区| 久久影院一区二区三区| 国产精品社区| 都市激情国产精品|