![JAR search and dependency download from the Maven repository](/logo.png)
io.github.wujun728.sql.engine.DynamicSqlEngine Maven / Gradle / Ivy
package io.github.wujun728.sql.engine;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import io.github.wujun728.sql.SqlMeta;
import io.github.wujun728.sql.context.Context;
import io.github.wujun728.sql.node.SqlNode;
import io.github.wujun728.sql.tag.XmlParser;
import io.github.wujun728.sql.token.TokenHandler;
import io.github.wujun728.sql.token.TokenParser;
public class DynamicSqlEngine {
Cache cache = new Cache();
public SqlMeta parse(String text, Map params) {
text = String.format("%s ", text);
SqlNode sqlNode = parseXml2SqlNode(text);
Context context = new Context(params);
parseSqlText(sqlNode, context);
parseParameter(context);
SqlMeta sqlMeta = new SqlMeta(context.getSql(), context.getJdbcParameters());
return sqlMeta;
}
public Set parseParameter(String text) {
text = String.format("%s ", text);
SqlNode sqlNode = parseXml2SqlNode(text);
HashSet set = new HashSet<>();
sqlNode.applyParameter(set);
return set;
}
private SqlNode parseXml2SqlNode(String text) {
SqlNode node = cache.getNodeCache().get(text);
if (node == null) {
node = XmlParser.parseXml2SqlNode(text);
cache.getNodeCache().put(text, node);
}
return node;
}
/**
* 解析标签,去除标签,替换 ${}为常量值, #{}保留不变
*
* @param sqlNode
* @param context
*/
private void parseSqlText(SqlNode sqlNode, Context context) {
sqlNode.apply(context);
}
/**
* #{}替换成?,并且将?对应的参数值按顺序保存起来
*
* @param context
*/
private void parseParameter(Context context) {
TokenParser tokenParser = new TokenParser("#{", "}", new TokenHandler() {
@Override
public String handleToken(String content) {
Object value = context.getOgnlValue(content);
if (value == null) {
throw new RuntimeException("could not found value : " + content);
}
context.addParameter(value);
return "?";
}
});
String sql = tokenParser.parse(context.getSql());
context.setSql(sql);
}
public static void main(String[] args) {
DynamicSqlEngine engine = new DynamicSqlEngine();
String sql = ("select id > ${minId} #{minId} and id < ${maxId} #{maxId} ");
Map map = new HashMap<>();
map.put("minId", 100);
map.put("maxId", 500);
engine.parse(sql, map);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy