您好,登錄后才能下訂單哦!
今天小編給大家分享一下Mybatis的動態Sql組合模式怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
當同一類型的很多對象組成一個樹結構的時候,可以考慮使用組合模式,組合模式涉及三個類:
Component接口:定義樹的各個節點的一些操作
Left類:這個是樹的葉子結點,實現Component接口,對于節點的管理它不去實現,只實現業務邏輯
Composite類:這個是樹的非葉子節點,實現Component接口,不但實現業務邏輯,同時會管理子節點,會有個Component接口的集合類來管理子節點
SqlNode就是扮演組合模式中的Component角色,Sql標簽會解析成SqlNode對象,
public interface SqlNode { boolean apply(DynamicContext context); }
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類了:
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是解析出的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是解析出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是非動態的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組合模式怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。