场景
在项目中如有一条查询语句,需要将其中表名所在的库名补充上(库名已知),
例如:select id from a,表a所在库叫d,那么需要修改为select id from d.a
初步思考
所以最开始打算用正则,不区分大小写的形式匹配到from+空格+不带点、不带空格的字符串,然后将第三部分替换。
有了如下代码:
private String dealSql(String sql, String dbName) {
sql = sql.replaceAll("\\s+", " ").replace(";"," ");
String result = sql;
String p = "(from)(\\s+)([^\\s]+)";
Pattern pattern = Pattern.compile(p, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(sql);
while (matcher.find()) {
if(matcher.groupCount() == 3) {
if(!matcher.group(3).contains(".")) {
result = matcher.replaceAll("$1$2" + dbName + ".$3");
}
}
}
return result;
}
经过测试
深入思考
貌似结果是正确的,但是由于sql不可能只有这样一种情况,还会有诸如以下形式产生:
多表查询,使用where关联selec