国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

詳解mybatis @SelectProvider 注解

瀏覽:3日期:2023-10-21 08:39:17
01、前言

為什么會寫這篇文章, 因為在看到 MapperAnnotationBuilder 構(gòu)造方法初始化時, 發(fā)現(xiàn)了四個從未見過的注解

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舉例

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

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

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

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

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

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

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

有三點需要注意:

方法入?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 只是在定義注解的方式上有所不同, 一個是直接定義 sql, 一個是在外部定義好 sql 直接引用, 沒有質(zhì)的區(qū)別

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

5.1 @Select

這種方式能夠定義簡單的 sql, 不涉及復雜查詢和多參數(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 文件

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

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

06、總結(jié)篇

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

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

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

相關(guān)文章:
主站蜘蛛池模板: 一a一片一级一片啪啪 | 成人做爰毛片免费视频 | 中文字幕一区视频一线 | 好吊妞国产欧美日韩视频 | 国产精品久久久久国产精品三级 | 精品视频自拍 | 国产一级一片免费播放刺激 | 成人免费视频一区二区 | 手机看片精品高清国产日韩 | 亚洲国产成人久久综合碰 | 久9视频这里只有精品 | 国产亚洲欧美久久精品 | 久久国产欧美另类久久久 | 亚洲精品乱无伦码 | 精品成人毛片一区二区视 | 视频一区在线 | 欧美另类激情 | 在线成人播放毛片 | 一级毛片免费观看久 | 在线观看片成人免费视频 | 爽死你个放荡粗暴小淫货双女视频 | 亚洲高清无在码在线无弹窗 | 日本人一级毛片免费视频 | 一及毛片 | 欧美精品区 | 黄色一级毛片网站 | 日本欧美片 | 亚洲欧美日本韩国综合在线观看 | 亚洲成a人v大片在线观看 | 国产高清一级片 | a级毛片免费观看在线播放 a级毛片免费看 | 国产成人99久久亚洲综合精品 | 国内精品影院久久久久 | 国产一区二区免费在线 | 91成人免费观看在线观看 | 在线免费观看一级片 | 日韩欧美一区二区精品久久 | 草草影院第一页yycccom | 色一情一乱一乱91av | 欧美成人观看视频在线 | 国产伦精品一区三区视频 |