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

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

詳解mybatis @SelectProvider 注解

瀏覽:25日期: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 對(duì)應(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 的三種形式, 以及介紹不同的方式對(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 語法, 還是比較方便的

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

詳解mybatis @SelectProvider 注解

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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一区二区三区中文字幕| 91精品综合| 国产激情精品一区二区三区| 日本视频中文字幕一区二区三区| 91精品亚洲| 免费av一区二区三区四区| 免费看av不卡| 亚洲小说欧美另类婷婷| 99精品99| 视频一区二区中文字幕| 亚洲精品欧美| 国产欧美一区二区三区精品观看| 久久精品一区二区三区中文字幕| 亚洲免费福利| 亚洲我射av| 日韩精品一区二区三区中文 | 亚洲一区av| 免费久久精品| 日韩在线卡一卡二| 国产一区 二区| 日韩精品2区| 国产一区亚洲| 国产剧情在线观看一区| 午夜影院一区| 亚洲毛片在线免费| 卡一卡二国产精品| 今天的高清视频免费播放成人| 日韩欧美中文字幕电影 | 免费毛片在线不卡| 久久电影一区| 午夜精品成人av| 亚洲精选成人| 91欧美在线| 日本午夜精品一区二区三区电影| 欧美日韩亚洲在线观看| 国产精品欧美在线观看| 亚洲免费网址| 日本在线高清| 国产精品久久久久久妇女| 日韩欧美视频专区| 国产精品18| 日韩黄色在线观看| 久久69成人| 久久精品97| 视频一区二区三区在线| 国产在线观看www| 国产精品一区二区三区www| 性色av一区二区怡红| 99在线精品免费视频九九视| 国产精品国产三级国产在线观看| 亚洲天堂日韩在线| 综合激情视频| 夜夜嗨av一区二区三区网站四季av| 丁香六月综合| 美女精品视频在线| 国产精品一区二区中文字幕| 视频一区二区三区在线| 久久毛片亚洲| 精品日韩在线| 国产欧美啪啪| 国产欧美69| 国产精品九九| 免费一级欧美片在线观看网站 | 不卡视频在线| 美女久久精品| 久久精品午夜| 国产精品115| 国产毛片精品| 国模大尺度视频一区二区| 国产精品成人**免费视频| 一区二区国产在线观看| 最近国产精品视频| 日韩av在线免费观看不卡| 国产亚洲精品美女久久| 四季av一区二区凹凸精品| 一本大道色婷婷在线| 欧美日韩中文一区二区| 久久婷婷丁香| 亚洲少妇在线| 日韩精品91亚洲二区在线观看| 91精品国产自产在线丝袜啪| 免费不卡中文字幕在线| 亚洲精品综合| 日韩精品乱码av一区二区| 国产精品宾馆| 欧美日韩视频网站| 丝袜美腿高跟呻吟高潮一区| 国产乱论精品| 国产剧情一区| 国产精品jk白丝蜜臀av小说| 九九99久久精品在免费线bt| 日韩精品一区二区三区中文| 玖玖玖国产精品| 日韩高清一区| 精品免费av在线| 亚洲午夜天堂| 亚洲h色精品| 亚洲在线久久| 国产在线观看www| 婷婷视频一区二区三区| 日韩精品永久网址| 国产精品亚洲欧美一级在线| 日韩和的一区二在线| 日本午夜精品一区二区三区电影 | 福利一区和二区| 视频一区在线视频| 中文另类视频| 国产成人精品999在线观看| 亚洲精品三级| 在线观看精品| 亚州av日韩av| 国产亚洲毛片| а√天堂中文在线资源8| 一级欧美视频| 久久网站免费观看| 精品久久亚洲| 国产欧美自拍| 日韩欧美美女在线观看| 日韩视频一区二区三区在线播放免费观看| 九九久久国产| 国产一区二区三区四区二区| 国产精品久久久久9999高清| 亚洲精品伊人| 欧美亚洲自偷自偷| 日本不卡的三区四区五区| 久久尤物视频| 国产成人精选| 岛国av在线网站| 成人精品高清在线视频| 久久精品欧洲| 精品伊人久久| 国产欧美日韩综合一区在线播放| 一本综合精品| 日韩毛片网站| 美女视频黄久久| 国产66精品| 欧美国产91| 在线精品视频一区| 中文字幕中文字幕精品| 亚欧洲精品视频在线观看| 日韩精品一区二区三区中文字幕| 91精品国产自产观看在线| 精品精品99| 亚洲国产专区| 日韩不卡一区二区三区| 国产精品视频3p| 女生影院久久| 一区二区三区四区日韩| 久久不卡日韩美女| 亚洲少妇一区| 久久精品免费看| 精品少妇av| 日本高清不卡一区二区三区视频 | 你懂的网址国产 欧美| 国产一区国产二区国产三区| 国产精品7m凸凹视频分类| 97久久亚洲| 91青青国产在线观看精品| 亚洲二区精品| 日韩精品第一| 亚洲天堂久久| 中文字幕日韩高清在线| 国产极品久久久久久久久波多结野| 国产激情在线播放| 日韩精品一级中文字幕精品视频免费观看 | 国产精品1区| 国产精品hd| 韩国久久久久久| 欧美 日韩 国产一区二区在线视频 | 三上亚洲一区二区| 欧美xxxx中国| 欧美日韩三区| 欧美一级全黄| 亚洲精品一区三区三区在线观看| 日韩中文字幕1| 国产婷婷精品| 欧美aⅴ一区二区三区视频| 免费日韩一区二区| 欧美日韩国产高清电影| 国产成人免费精品| 国产一区二区三区天码| 久久99精品久久久野外观看| 日韩激情一区二区| 一本一本久久| 高清日韩欧美| 里番精品3d一二三区| 日韩avvvv在线播放| 97久久精品| 久久超级碰碰| 国产精品主播在线观看| 亚洲香蕉视频| 日本午夜精品| 国产福利亚洲| 国产成人久久| 91精品国产乱码久久久久久久| 日韩国产欧美| 日韩一区自拍| 男人的天堂久久精品| 日本在线视频一区二区| 女同性一区二区三区人了人一|