TextSqlNode是文本sql节点,提供解析文本sql的功能。
package com.example.aninbatis.sqlnode;import com.example.aninbatis.sqlsource.DynamicContext;import com.example.aninbatis.utils.GenericTokenParser;import com.example.aninbatis.utils.OgnlUtils;import com.example.aninbatis.utils.SimpleTypeRegistry;import com.example.aninbatis.utils.TokenHandler;/*** 文本sql节点* 首先是文本内容,其次该内容中包含${}* 如果是这种SqlNode则存储在DynamicSqlSource中*/public class TextSqlNode implements SqlNode {/*** sql文本*/private String sqlText;public TextSqlNode(String sqlText) {this.sqlText = sqlText;}/*** 要处理${} 比如说username like '%${username}' 入参username=“zhangsan” 处理之后username* like '%zhangsan'*/@Overridepublic void apply(DynamicContext context) {TokenHandler tokenHandler = new BindingTokenParser(context);GenericTokenParser tokenParser = new GenericTokenParser("${", "}", tokenHandler);// tokenParser.parse(sqlText)参数是未处理的,返回值是已处理的(没有${})context.appendSql(tokenParser.parse(sqlText));}public boolean isDynamic() {if (sqlText.indexOf("${") > -1) {return true;}return false;}private static class BindingTokenParser implements TokenHandler {private DynamicContext context;public BindingTokenParser(DynamicContext context) {this.context = context;}/*** expression:比如说${username},那么expression就是username username也就是Ognl表达式*/@Overridepublic String handleToken(String expression) {Object paramObject = context.getBindings().get("_parameter");if (paramObject == null) {// context.getBindings().put("value", null);return "";} else if (SimpleTypeRegistry.isSimpleType(paramObject.getClass())) {// context.getBindings().put("value", paramObject);return String.valueOf(paramObject);}// 使用Ognl api去获取相应的值Object value = OgnlUtils.getValue(expression, context.getBindings());String srtValue = value == null ? "" : String.valueOf(value);return srtValue;}}}
