public static void main(String[] args) {
String text="select * from usr where id=#{id} and name=#{id}";
HashMap<String, Object> map = new HashMap<>();
map.put("id","alex");
System.out.printf(parseSeql(text,map));
}
public static String parseSeql(String sql, Map<String,Object> nameArgMap){
StringBuilder sb = new StringBuilder();
int len=sql.length();
// char[] arr=sql.toCharArray();
for (int i = 0; i < len; i++) {
if(sql.charAt(i) =='#'){
int nextIndex=i+1;
if (sql.charAt(nextIndex)!='{'){
throw new RuntimeException(String.format("此处应该为#{\nsql:%s\n index:%d:",sb.toString(),nextIndex));
}
StringBuilder argSB = new StringBuilder();
i=parseSeqlArgs(argSB,sql,nextIndex);
String argName=argSB.toString();
Object ageValue=nameArgMap.get(argName);
if (ageValue == null) {
throw new RuntimeException(String.format("找不到参数#{\nsql:%s\n index:%d:",sb.toString(),nextIndex));
}
sb.append(ageValue.toString());
continue;
}
sb.append(sql.charAt(i));
}
return sb.toString();
}
private static int parseSeqlArgs(StringBuilder argSB, String sql, int nextIndex) {
nextIndex++;
for (;nextIndex<sql.length();nextIndex++){
char c=sql.charAt(nextIndex);
if (c !='}') {
argSB.append(c);
continue;
}
if(c=='}'){
return nextIndex;
}
}
throw new RuntimeException(String.format("缺少右括号#{\nsql:%s\n index:%d:",argSB.toString(),nextIndex));
}
}
字符匹配之模仿mybatis词解析器
最新推荐文章于 2022-12-13 10:14:28 发布