最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis的動(dòng)態(tài)Sql組合模式詳情

 更新時(shí)間:2022年08月18日 11:47:14   作者:周杰倫本人???????  
這篇文章主要介紹了Mybatis的動(dòng)態(tài)Sql組合模式詳情,這篇文章從組合模式的角度分析了Mybatis動(dòng)態(tài)sql的部分,SqlNode是組合模式的Component接口,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下

前言

當(dāng)同一類(lèi)型的很多對(duì)象組成一個(gè)樹(shù)結(jié)構(gòu)的時(shí)候,可以考慮使用組合模式,組合模式涉及三個(gè)類(lèi):

Component接口:定義樹(shù)的各個(gè)節(jié)點(diǎn)的一些操作

Left類(lèi):這個(gè)是樹(shù)的葉子結(jié)點(diǎn),實(shí)現(xiàn)Component接口,對(duì)于節(jié)點(diǎn)的管理它不去實(shí)現(xiàn),只實(shí)現(xiàn)業(yè)務(wù)邏輯

Composite類(lèi):這個(gè)是樹(shù)的非葉子節(jié)點(diǎn),實(shí)現(xiàn)Component接口,不但實(shí)現(xiàn)業(yè)務(wù)邏輯,同時(shí)會(huì)管理子節(jié)點(diǎn),會(huì)有個(gè)Component接口的集合類(lèi)來(lái)管理子節(jié)點(diǎn)

Component角色

SqlNode就是扮演組合模式中的Component角色,Sql標(biāo)簽會(huì)解析成SqlNode對(duì)象,

public interface SqlNode {
  boolean apply(DynamicContext context);
}

Composite角色

MixedSqlNode類(lèi)扮演組合模式的Composite角色:

它也是解析<otherwise>標(biāo)簽的類(lèi)

public class MixedSqlNode implements SqlNode {
  private final List<SqlNode> contents;

  public MixedSqlNode(List<SqlNode> contents) {
    this.contents = contents;
  }

  @Override
  public boolean apply(DynamicContext context) {
    contents.forEach(node -> node.apply(context));
    return true;
  }
}

它有個(gè)SqlNode的集合類(lèi),記錄SqlNode對(duì)象,apply方法就是遍歷集合,依次調(diào)用自己的apply()方法

剩余其他SqlNode的實(shí)現(xiàn)類(lèi)就充當(dāng)組合模式的Left類(lèi)了:

Left類(lèi)角色

TextSqlNode

TextSqlNode是包含${}的動(dòng)態(tài)sql片段,它的apply()方法的實(shí)現(xiàn):

  @Override
  public boolean apply(DynamicContext context) {
    GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter));
    context.appendSql(parser.parse(text));
    return true;
  }
  private GenericTokenParser createParser(TokenHandler handler) {
    return new GenericTokenParser("${", "}", handler);
  }

創(chuàng)建GenericTokenParser解析器,然后解析包含${}的sql片段,解析后保存到DynamicContext中

TrimSqlNode

TrimSqlNode是解析出的trim標(biāo)簽的對(duì)象,trim標(biāo)簽可以去除sql的and、逗號(hào)或者拼接where關(guān)鍵字等,

  private final SqlNode contents;
  @Override
  public boolean apply(DynamicContext context) {
    FilteredDynamicContext filteredDynamicContext = new FilteredDynamicContext(context);
    boolean result = contents.apply(filteredDynamicContext);
    filteredDynamicContext.applyAll();
    return result;
  }

先調(diào)用SqlNode 的apply方法 ,然后調(diào)用FilteredDynamicContext的applyAll()方法進(jìn)行前后綴的處理,F(xiàn)ilteredDynamicContext在DynamicContext包裝了一層,利用了裝飾者模式,除了DynamicContext的存儲(chǔ)解析結(jié)果和參數(shù)功能外還能進(jìn)行前后綴的處理

IfSqlNode

IfSqlNode是解析出if 標(biāo)簽、when標(biāo)簽的類(lèi),

public class IfSqlNode implements SqlNode {
  private final ExpressionEvaluator evaluator;
  private final String test;
  private final SqlNode contents;

  public IfSqlNode(SqlNode contents, String test) {
    this.test = test;
    this.contents = contents;
    this.evaluator = new ExpressionEvaluator();
  }

  @Override
  public boolean apply(DynamicContext context) {
    if (evaluator.evaluateBoolean(test, context.getBindings())) {
      contents.apply(context);
      return true;
    }
    return false;
  }
}

ExpressionEvaluator是解析工具類(lèi),test記錄了if標(biāo)簽的test表達(dá)式,apply()方法中ExpressionEvaluator工具類(lèi)解析test表達(dá)式,返回true之后調(diào)用具體SqlNode的apply()方法

StaticTextSqlNode

StaticTextSqlNode是非動(dòng)態(tài)的sql片段,apply()方法直接把sql片段追加到DynamicContext的sqlBuilder屬性中

public class StaticTextSqlNode implements SqlNode {
  private final String text;

  public StaticTextSqlNode(String text) {
    this.text = text;
  }

  @Override
  public boolean apply(DynamicContext context) {
    context.appendSql(text);
    return true;
  }
}

總結(jié)

這篇文章從組合模式的角度分析了Mybatis動(dòng)態(tài)sql的部分,SqlNode是組合模式的Component接口,MixedSqlNode是組合模式的Composite角色,還有其他的SqlNode的實(shí)現(xiàn)類(lèi)TextSqlNode、TrimSqlNode、IfSqlNode、StaticTextSqlNode,它們是解析不同的標(biāo)簽,TextSqlNode解析包含${}的動(dòng)態(tài)sql片段,TrimSqlNode類(lèi)解析trim標(biāo)簽,IfSqlNode是解析出if 標(biāo)簽、when標(biāo)簽的類(lèi),StaticTextSqlNode是非動(dòng)態(tài)的sql片段

到此這篇關(guān)于Mybatis的動(dòng)態(tài)Sql組合模式詳情的文章就介紹到這了,更多相關(guān)Mybatis 組合模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)之static的用法

    Java基礎(chǔ)之static的用法

    這篇文章主要介紹了Java基礎(chǔ)之static的用法,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-05-05
  • 一步步教會(huì)你使用Java原生指令編譯并運(yùn)行一個(gè)程序

    一步步教會(huì)你使用Java原生指令編譯并運(yùn)行一個(gè)程序

    Java是一種廣泛使用的編程語(yǔ)言,具有跨平臺(tái)性和面向?qū)ο蟮奶匦?下面這篇文章主要給大家介紹了關(guān)于使用Java原生指令編譯并運(yùn)行一個(gè)程序的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • mybatis基本實(shí)例詳解

    mybatis基本實(shí)例詳解

    這篇文章主要介紹了mybatis基本實(shí)例詳解以及mybatis自由模糊查詢,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • java計(jì)算百分比值的方法

    java計(jì)算百分比值的方法

    這篇文章主要介紹了java計(jì)算百分比值的方法,涉及java數(shù)值運(yùn)算的技巧,需要的朋友可以參考下
    2015-03-03
  • Java二叉樹(shù)的遍歷思想及核心代碼實(shí)現(xiàn)

    Java二叉樹(shù)的遍歷思想及核心代碼實(shí)現(xiàn)

    今天小編就為大家分享一篇關(guān)于Java二叉樹(shù)的遍歷思想及核心代碼實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • java實(shí)現(xiàn)Socket通信之單線程服務(wù)

    java實(shí)現(xiàn)Socket通信之單線程服務(wù)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Socket通信的單線程服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • IDEA配置SpringBoot熱啟動(dòng),以及熱啟動(dòng)失效問(wèn)題

    IDEA配置SpringBoot熱啟動(dòng),以及熱啟動(dòng)失效問(wèn)題

    這篇文章主要介紹了IDEA配置SpringBoot熱啟動(dòng),以及熱啟動(dòng)失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 關(guān)于Mybatis-plus設(shè)置字段為空的正確寫(xiě)法

    關(guān)于Mybatis-plus設(shè)置字段為空的正確寫(xiě)法

    這篇文章主要介紹了關(guān)于Mybatis-plus設(shè)置字段為空的正確寫(xiě)法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 關(guān)于弗洛伊德算法求最短路徑詳解

    關(guān)于弗洛伊德算法求最短路徑詳解

    這篇文章主要介紹了關(guān)于弗洛伊德算法求最短路徑詳解,弗洛伊德算法VS迪杰斯特拉算法:迪杰斯特拉算法通過(guò)選定的被訪問(wèn)頂點(diǎn),求出從出發(fā)訪問(wèn)頂點(diǎn)到其他項(xiàng)點(diǎn)的最短路徑:弗洛伊德算法中每-個(gè)頂點(diǎn)都是出發(fā)訪問(wèn)點(diǎn),需要的朋友可以參考下
    2023-07-07
  • Java 方法遞歸的思路詳解

    Java 方法遞歸的思路詳解

    程序調(diào)用自身的編程技巧稱(chēng)為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用。但是如果沒(méi)終止條件會(huì)造成死循環(huán),所以遞歸代碼里要有結(jié)束自調(diào)自的條件,接下來(lái)講解一下學(xué)習(xí)遞歸的思路
    2022-04-04

最新評(píng)論

连城县| 弥渡县| 闵行区| 湄潭县| 东莞市| 女性| 左云县| 普宁市| 汕头市| 吴旗县| 溧水县| 长岭县| 江山市| 南召县| 兴业县| 连山| 大庆市| 汾西县| 龙泉市| 临清市| 厦门市| 烟台市| 辰溪县| 汕尾市| 浏阳市| 自治县| 江永县| 拜泉县| 深州市| 历史| 远安县| 遂宁市| 扶沟县| 建德市| 莱阳市| 甘肃省| 宜宾县| 陵川县| 嘉义市| 余庆县| 镇宁|