91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatis的動態Sql組合模式怎么實現

發布時間:2022-08-26 17:42:22 來源:億速云 閱讀:151 作者:iii 欄目:開發技術

今天小編給大家分享一下Mybatis的動態Sql組合模式怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    前言

    當同一類型的很多對象組成一個樹結構的時候,可以考慮使用組合模式,組合模式涉及三個類:

    Component接口:定義樹的各個節點的一些操作

    Left類:這個是樹的葉子結點,實現Component接口,對于節點的管理它不去實現,只實現業務邏輯

    Composite類:這個是樹的非葉子節點,實現Component接口,不但實現業務邏輯,同時會管理子節點,會有個Component接口的集合類來管理子節點

    Component角色

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

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

    Composite角色

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

    它也是解析<otherwise>標簽的類

    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方法就是遍歷集合,依次調用自己的apply()方法

    剩余其他SqlNode的實現類就充當組合模式的Left類了:

    Left類角色

    TextSqlNode

    TextSqlNode是包含${}的動態sql片段,它的apply()方法的實現:

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

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

    TrimSqlNode

    TrimSqlNode是解析出的trim標簽的對象,trim標簽可以去除sql的and、逗號或者拼接where關鍵字等,

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

    先調用SqlNode 的apply方法 ,然后調用FilteredDynamicContext的applyAll()方法進行前后綴的處理,FilteredDynamicContext在DynamicContext包裝了一層,利用了裝飾者模式,除了DynamicContext的存儲解析結果和參數功能外還能進行前后綴的處理

    IfSqlNode

    IfSqlNode是解析出if 標簽、when標簽的類,

    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標簽的test表達式,apply()方法中ExpressionEvaluator工具類解析test表達式,返回true之后調用具體SqlNode的apply()方法

    StaticTextSqlNode

    StaticTextSqlNode是非動態的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;
      }
    }

    以上就是“Mybatis的動態Sql組合模式怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    澄江县| 惠安县| 巨鹿县| 隆子县| 遂川县| 株洲市| 红河县| 安龙县| 双柏县| 安仁县| 瑞昌市| 黑龙江省| 海安县| 大兴区| 大关县| 化州市| 松江区| 洛扎县| 章丘市| 开鲁县| 彭山县| 团风县| 葵青区| 绍兴市| 峡江县| 南木林县| 吉林省| 全州县| 平安县| 兴城市| 内乡县| 南乐县| 象州县| 北流市| 西畴县| 融水| 陇南市| 利川市| 镇江市| 子长县| 日照市|