亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

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

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

Component角色

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

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

Composite角色

MixedSqlNode類扮演組合模式的Composite角色:

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

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;
  }
}

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

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

Left類角色

TextSqlNode

TextSqlNode是包含${}的動態(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)簽的對象,trim標(biāo)簽可以去除sql的and、逗號或者拼接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的存儲解析結(jié)果和參數(shù)功能外還能進(jìn)行前后綴的處理

IfSqlNode

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

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是解析工具類,test記錄了if標(biāo)簽的test表達(dá)式,apply()方法中ExpressionEvaluator工具類解析test表達(dá)式,返回true之后調(diào)用具體SqlNode的apply()方法

StaticTextSqlNode

StaticTextSqlNode是非動態(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動態(tài)sql的部分,SqlNode是組合模式的Component接口,MixedSqlNode是組合模式的Composite角色,還有其他的SqlNode的實(shí)現(xiàn)類TextSqlNode、TrimSqlNode、IfSqlNode、StaticTextSqlNode,它們是解析不同的標(biāo)簽,TextSqlNode解析包含${}的動態(tài)sql片段,TrimSqlNode類解析trim標(biāo)簽,IfSqlNode是解析出if 標(biāo)簽、when標(biāo)簽的類,StaticTextSqlNode是非動態(tài)的sql片段

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

相關(guān)文章

  • SpringDataMongoDB多文檔事務(wù)的實(shí)現(xiàn)

    SpringDataMongoDB多文檔事務(wù)的實(shí)現(xiàn)

    mongodb4.0也出來一段時間了,這個版本最為大眾期待的特性就是支持了多文檔事務(wù)。這篇文章主要介紹了SpringDataMongoDB多文檔事務(wù)的實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2018-11-11
  • 支持SpEL表達(dá)式的自定義日志注解@SysLog介紹

    支持SpEL表達(dá)式的自定義日志注解@SysLog介紹

    這篇文章主要介紹了支持SpEL表達(dá)式的自定義日志注解@SysLog,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 使用SpringBoot注解方式處理事務(wù)回滾實(shí)現(xiàn)

    使用SpringBoot注解方式處理事務(wù)回滾實(shí)現(xiàn)

    這篇文章主要介紹了使用SpringBoot注解方式處理事務(wù)回滾實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 淺談用SpringBoot實(shí)現(xiàn)策略模式

    淺談用SpringBoot實(shí)現(xiàn)策略模式

    本文主要介紹了SpringBoot實(shí)現(xiàn)策略模式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • java分布式面試系統(tǒng)限流最佳實(shí)踐

    java分布式面試系統(tǒng)限流最佳實(shí)踐

    這篇文章主要介紹了java分布式面試系統(tǒng)限流最佳實(shí)踐場景分析解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • 關(guān)于Java中Json的各種處理

    關(guān)于Java中Json的各種處理

    這篇文章主要介紹了關(guān)于Java中Json的各種處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • RabbitMQ消息單獨(dú)與批量的TTL詳細(xì)介紹

    RabbitMQ消息單獨(dú)與批量的TTL詳細(xì)介紹

    這篇文章主要介紹了RabbitMQ消息單獨(dú)與批量的TTL,TTL全名是Time To Live存活時間,表示當(dāng)消息由生產(chǎn)端存入MQ當(dāng)中的存活時間,當(dāng)時間到達(dá)的時候還未被消息就會被自動清除,感興趣的同學(xué)可以參考下文
    2023-05-05
  • java如何生成可變表頭的excel

    java如何生成可變表頭的excel

    這篇文章主要為大家詳細(xì)介紹了java生成可變表頭excel的方法,傳入一個表頭和數(shù)據(jù),將數(shù)據(jù)導(dǎo)入到excel中,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java 抽象類與接口的對比

    Java 抽象類與接口的對比

    這篇文章主要介紹了Java 抽象類與接口的對比,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • 猜數(shù)游戲java實(shí)現(xiàn)代碼

    猜數(shù)游戲java實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)猜數(shù)游戲代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論