成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

詳解mybatis @SelectProvider 注解

瀏覽:3日期:2023-10-21 08:39:17
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è)屬性必須組合使用

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

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

如何根據(jù)注解定義 sql 語句呢, 首先定義 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 對應(yīng)的存放 sql 語句的類, 以及定義返回 sql 語句的方法

有三點(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 語句的工具類

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 的三種形式, 以及介紹不同的方式對應(yīng)的使用場景

5.1 @Select

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

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

SELECT * FROM subject WHERE id = #{id}5.2 @SelectProvider

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

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

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

詳解mybatis @SelectProvider 注解

5.3 .xml 文件

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

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

06、總結(jié)篇

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

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

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

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
中国成人亚色综合网站| 欧美日韩精品一区二区三区 | 久久日韩粉嫩一区二区三区| 中文字幕日韩欧美一区二区三区| 一区二区三区在线观看网站| 国产米奇在线777精品观看| 亚洲激情一区二区三区| 在线播放亚洲一区| 亚洲国产va精品久久久不卡综合| 成人综合日日夜夜| 色婷婷综合五月| 国产精品国产三级国产普通话蜜臀 | 一区二区黄色| 欧美一区二区三区免费观看视频| 亚洲主播在线观看| 94-欧美-setu| 色哟哟欧美精品| 亚洲视频中文字幕| 成人av免费在线播放| 在线视频一区二区三| 亚洲免费av在线| 国产成人免费视| 久久亚洲高清| 亚洲午夜激情网站| 韩国一区二区三区在线观看| 欧美一级搡bbbb搡bbbb| 欧美猛男gaygay网站| 亚洲高清免费观看| 1024亚洲| 亚洲国产激情av| a在线欧美一区| 欧美三级电影网| 舔着乳尖日韩一区| 亚洲精品一区二区三区av| 久久久久国产精品麻豆| 粉嫩一区二区三区性色av| 欧美曰成人黄网| 日韩高清国产一区在线| 亚洲精品系列| 亚洲少妇最新在线视频| 欧美成人久久| 国产亚洲精品福利| 99国内精品久久| 337p日本欧洲亚洲大胆精品| 精品国产精品网麻豆系列| 韩国自拍一区| 欧美日本国产一区| 免费一级片91| 欧美综合色免费| 久久精品国产精品亚洲红杏| 在线中文字幕一区| 日本不卡高清视频| 91电影在线观看| 韩国成人在线视频| 日韩欧美成人一区| 99久久精品99国产精品| 久久久久9999亚洲精品| 91美女片黄在线| 欧美成人性福生活免费看| 91在线云播放| 一区二区在线观看免费视频播放| 亚洲精品无人区| 亚洲综合在线观看视频| 久久先锋影音| 国产美女视频91| 国产色产综合色产在线视频| 欧洲另类一二三四区| 欧美a级理论片| 日韩欧美高清dvd碟片| 欧美成人首页| 亚洲欧美日韩综合aⅴ视频| 亚洲欧美日韩国产一区| 久久国产日韩欧美精品| 日韩一级黄色大片| 欧美日韩国产成人精品| 一二三四区精品视频| 午夜亚洲福利在线老司机| 麻豆成人在线观看| 欧美高清性hdvideosex| 91色porny蝌蚪| 亚洲色图制服丝袜| 欧美福利视频一区| 极品中文字幕一区| 看片网站欧美日韩| 久久国产精品亚洲va麻豆| 黄一区二区三区| 欧美激情一区二区三区蜜桃视频 | 亚洲一区自拍偷拍| 欧美日韩精品系列| 国产专区一区| 奇米影视一区二区三区小说| 精品成人佐山爱一区二区| 国产亚洲欧美一区二区 | 久久久三级国产网站| 国产一区91| 成人短视频下载| 亚洲综合在线视频| 精品日产卡一卡二卡麻豆| 亚洲在线免费| 国产69精品久久久久777| 亚洲欧洲制服丝袜| 91精品国产品国语在线不卡| 99精品热视频只有精品10| 国产成人午夜精品影院观看视频| 亚洲精品成人天堂一二三| 亚洲精品一区二区三区99| 久久精品首页| 99久久99久久综合| 青青青爽久久午夜综合久久午夜 | 日韩一本二本av| 色噜噜夜夜夜综合网| 亚洲网友自拍| 99久久精品国产导航| 免费成人av在线| 亚洲免费在线看| 国产欧美一区二区精品久导航| 欧美日韩国产系列| 久久精品国产99精品国产亚洲性色| 欧美日本国产| 国产成人av影院| 韩国三级中文字幕hd久久精品| 国产日韩精品一区二区浪潮av| 中文字幕人成不卡一区| 亚洲一区二区三区精品在线观看| 不卡一区二区三区四区| 久久精品国产色蜜蜜麻豆| 天堂一区二区在线免费观看| 18成人在线视频| 久久精品夜色噜噜亚洲a∨| 欧美一级午夜免费电影| 91精品蜜臀在线一区尤物| 欧美日韩在线观看一区二区| 日本韩国欧美三级| 色婷婷综合视频在线观看| 亚洲综合日韩| 国产麻豆日韩| 亚洲色图自拍| 99日韩精品| 亚洲男女自偷自拍| 久久精品观看| 亚洲日本免费| 亚洲精品日韩在线观看| 亚洲毛片视频| 韩日午夜在线资源一区二区| 欧美亚州在线观看| 欧美午夜精品| 亚洲精品一级| 久久伊人亚洲| 欧美日韩国产bt| 日韩欧美国产一区在线观看| 欧美不卡一区二区三区四区| 欧美xxxxx牲另类人与| 国产午夜精品一区二区三区四区| 26uuuu精品一区二区| 中文字幕精品三区| 亚洲三级在线免费| 亚洲一区二区三区在线看| 免费高清在线视频一区·| 国产中文一区二区三区| 成人高清在线视频| 欧美欧美全黄| 亚洲欧美日韩综合国产aⅴ| 欧美性色黄大片| 日韩精品一区二区三区视频 | 国产精品久久7| 国产一区二区高清不卡| 欧美丝袜丝交足nylons图片| 欧美一区二区精美| 国产精品久久久久桃色tv| 亚洲午夜精品久久久久久久久| 国产精品一区二区久久不卡| 欧美日韩一区在线观看视频| 色综合av在线| 国产无一区二区| 日韩影院免费视频| 99re成人精品视频| 午夜一级久久| 亚洲精品一线二线三线| 午夜精品福利一区二区三区av| 成人高清视频免费观看| 久久综合网络一区二区| 国产亚洲综合色| 久久精品国产在热久久| 黄色国产精品| 色婷婷国产精品| xnxx国产精品| 另类综合日韩欧美亚洲| 亚洲高清网站| 久久亚洲一级片| 久久99国产精品成人| 一区免费在线| 精品三级av在线| 性久久久久久久| 99久久精品一区| 国产麻豆日韩| 中文字幕电影一区| 青青草视频一区| 欧美日韩a区| 欧美精品一区二区三| 亚洲成人激情自拍|