protected MixedSqlNode parseDynamicTags(XNode node) { List<SqlNode> contents = new ArrayList<>(); NodeList children = node.getNode().getChildNodes(); for (int i = 0; i < children.getLength(); i++) { XNode child = node.newXNode(children.item(i)); if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) { String data = child.getStringBody(""); TextSqlNode textSqlNode = new TextSqlNode(data); if (textSqlNode.isDynamic()) { contents.add(textSqlNode); isDynamic = true; } else { contents.add(new StaticTextSqlNode(data)); } } else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) { // issue #628 String nodeName = child.getNode().getNodeName(); NodeHandler handler = nodeHandlerMap.get(nodeName); if (handler == null) { throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement."); } handler.handleNode(child, contents); isDynamic = true; } } return new MixedSqlNode(contents); }
public boolean isDynamic() { DynamicCheckerTokenParser checker = new DynamicCheckerTokenParser(); GenericTokenParser parser = createParser(checker); parser.parse(text); return checker.isDynamic(); }
public IfSqlNode ExampleValidSqlNode(Configuration configuration) { List<SqlNode> whenSqlNodes = new LinkedList<SqlNode>(); IfSqlNode noValueSqlNode = new IfSqlNode(new TextSqlNode(" and ${criterion.condition}"), "criterion.noValue"); whenSqlNodes.add(noValueSqlNode); IfSqlNode singleValueSqlNode = new IfSqlNode(new TextSqlNode(" and ${criterion.condition} #{criterion.value}"), "criterion.singleValue"); whenSqlNodes.add(singleValueSqlNode); IfSqlNode betweenValueSqlNode = new IfSqlNode(new TextSqlNode(" and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}"), "criterion.betweenValue"); whenSqlNodes.add(betweenValueSqlNode); List<SqlNode> listValueContentSqlNodes = new LinkedList<SqlNode>(); listValueContentSqlNodes.add(new TextSqlNode(" and ${criterion.condition}")); ForEachSqlNode listValueForEachSqlNode = new ForEachSqlNode(configuration, new StaticTextSqlNode("#{listItem}"), "criterion.value", null, "listItem", "(", ")", ","); listValueContentSqlNodes.add(listValueForEachSqlNode); IfSqlNode listValueSqlNode = new IfSqlNode(new MixedSqlNode(listValueContentSqlNodes), "criterion.listValue"); whenSqlNodes.add(listValueSqlNode); ChooseSqlNode chooseSqlNode = new ChooseSqlNode(whenSqlNodes, null); ForEachSqlNode criteriaSqlNode = new ForEachSqlNode(configuration, chooseSqlNode, "criteria.criteria", null, "criterion", null, null, null); TrimSqlNode trimSqlNode = new TrimSqlNode(configuration, criteriaSqlNode, "(", "and", ")", null); IfSqlNode validSqlNode = new IfSqlNode(trimSqlNode, "criteria.valid"); return validSqlNode; }
/** * 处理MapperClass内的匹配NamedMethod的MappedStatement以及SqlSource * * @param configuration MyBatis配置对象 * @param mapperClass Mapper的类型 */ public void namedSupport(Configuration configuration, Class<?> mapperClass) { if (ObjectUtils.isEmpty(mapperClass)) { throw new EnhanceFrameworkException("处理NamedMethod MappedStatement时,参数[mapperClass]为必填项."); } // 获取Mapper内定义的方法不包含上级接口 Method[] methods = mapperClass.getDeclaredMethods(); // 遍历Mapper内定义的每一个方法 for (Method method : methods) { // MappedStatement Id String statementId = mapperClass.getName() + "." + method.getName(); // 如果匹配方法规则查询 // 执行创建MappedStatement对象 // 调用对应的Provider,执行重载SqlSource if (!configuration.hasStatement(statementId) && NamedMethodHelper.isMatchNamed(method.getName())) { logger.debug("Invoke Named Reload : {} SqlSource.", statementId); MappedStatement statement = new MappedStatement.Builder(configuration, statementId, new DynamicSqlSource(configuration, new TextSqlNode("this is empty.")), getSqlCommandType(method.getName())).build(); // 将MappedStatement添加到Configuration configuration.addMappedStatement(statement); // 会自动根据方法规则匹配对应的Provider BaseProvider provider = ProviderHelper.getMethodProvider(statementId); provider.invokeNamedProviderMethod(statement); } } }
List<SqlNode> parseDynamicTags(XNode node) { List<SqlNode> contents = new ArrayList<SqlNode>(); NodeList children = node.getNode().getChildNodes(); for (int i = 0; i < children.getLength(); i++) { XNode child = node.newXNode(children.item(i)); if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) { String data = child.getStringBody(""); TextSqlNode textSqlNode = new TextSqlNode(data); if (textSqlNode.isDynamic()) { contents.add(textSqlNode); isDynamic = true; } else { contents.add(new StaticTextSqlNode(data)); } } else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) { // issue #628 String nodeName = child.getNode().getNodeName(); NodeHandler handler = nodeHandlers(nodeName); if (handler == null) { throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement."); } handler.handleNode(child, contents); isDynamic = true; } } return contents; }
/** * 根据Example查询 * * @param ms * @return */ public SqlNode selectByExample(MappedStatement ms) { Class<?> entityClass = getSelectReturnType(ms); //将返回值修改为实体类型 setResultType(ms, entityClass); List<SqlNode> sqlNodes = new LinkedList<SqlNode>(); //静态的sql部分:select column ... from table sqlNodes.add(new StaticTextSqlNode("SELECT")); IfSqlNode distinctSqlNode = new IfSqlNode(new StaticTextSqlNode("DISTINCT"), "distinct"); sqlNodes.add(distinctSqlNode); sqlNodes.add(new StaticTextSqlNode(EntityHelper.getSelectColumns(entityClass) + " FROM " + tableName(entityClass))); IfSqlNode ifNullSqlNode = new IfSqlNode(exampleWhereClause(ms.getConfiguration()), "_parameter != null"); sqlNodes.add(ifNullSqlNode); IfSqlNode orderByClauseSqlNode = new IfSqlNode(new TextSqlNode("order by ${orderByClause}"), "orderByClause != null"); sqlNodes.add(orderByClauseSqlNode); String orderByClause = EntityHelper.getOrderByClause(entityClass); if (orderByClause.length() > 0) { IfSqlNode defaultOrderByClauseSqlNode = new IfSqlNode(new StaticTextSqlNode("ORDER BY " + orderByClause), "orderByClause == null"); sqlNodes.add(defaultOrderByClauseSqlNode); } return new MixedSqlNode(sqlNodes); }
@Override public boolean apply(DynamicContext context) { GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter)); context.appendSql(parser.parse(text)); return true; }
@Override public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) { // issue #3 if (script.startsWith("<script>")) { XPathParser parser = new XPathParser(script, false, configuration.getVariables(), new XMLMapperEntityResolver()); return createSqlSource(configuration, parser.evalNode("/script"), parameterType); } else { // issue #127 script = PropertyParser.parse(script, configuration.getVariables()); TextSqlNode textSqlNode = new TextSqlNode(script); if (textSqlNode.isDynamic()) { return new DynamicSqlSource(configuration, textSqlNode); } else { return new RawSqlSource(configuration, script, parameterType); } } }
@Override public boolean apply(DynamicContext context) { GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter)); context.appendSql(parser.parse(text)); return true; }
@Override public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) { // issue #3 if (script.startsWith("<script>")) { XPathParser parser = new XPathParser(script, false, configuration.getVariables(), new XMLMapperEntityResolver()); return createSqlSource(configuration, parser.evalNode("/script"), parameterType); } else { // issue #127 script = PropertyParser.parse(script, configuration.getVariables()); TextSqlNode textSqlNode = new TextSqlNode(script); if (textSqlNode.isDynamic()) { return new DynamicSqlSource(configuration, textSqlNode); } else { return new RawSqlSource(configuration, script, parameterType); } } }
public boolean isDynamic() { DynamicCheckerTokenParser checker = new DynamicCheckerTokenParser(); GenericTokenParser parser = createParser(checker); parser.parse(text); return checker.isDynamic(); }