Java 在Update语句之后获取WHERE子句
我需要在update语句之后获取where子句,例如Java 在Update语句之后获取WHERE子句,java,mysql,Java,Mysql,我需要在update语句之后获取where子句,例如 updateuser\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex'; 目前,我可以使用以下代码获取where子句之后的所有内容: String query=“UPDATE user\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex'; int index=query.toUpperCase()
updateuser\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex';
目前,我可以使用以下代码获取where子句之后的所有内容:
String query=“UPDATE user\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex';
int index=query.toUpperCase().indexOf(“WHERE”);
如果(索引!=-1){
System.out.println(query.substring(index));
}
但后来我发现这有很大的缺陷,因为这些示例查询将失败:
updateuser\u accounts SET bio='这是我的bio'where user\u id=1或name='Alex'所在的位置;
更新用户\u帐户集,其中列='',其中用户\u id=1或名称='Alex'
更新用户\u行踪集columnName='',其中用户\u id=1或name='Alex'
本质上,如果表名或集合下的任何列名或列值包含单词“where”(不区分大小写),则此操作将失败
我目前的想法是按照一个正则表达式的思路,该正则表达式执行以下操作:
我不太熟悉正则表达式,因此需要帮助。请注意,实现该目标的任何其他方法也将受到高度赞赏。您需要某种SQL解析器,因为正则表达式在许多情况下都会失败(例如,如果where子句有一个子选择怎么办?)
我从未尝试过它,但它似乎是一个很好的解决方案您需要某种SQL解析器,因为正则表达式在许多情况下都会失败(例如,如果where子句有一个子select怎么办?)
我从未尝试过,但使用JSqlParser似乎是一个很好的解决方案这看起来像:
List<String> sqls = Arrays.asList("UPDATE user_accounts SET bio='This is my bio' WHERE user_id = 1 OR name = 'Alex';",
"UPDATE user_accounts SET whereColumn='' WHERE user_id = 1 OR name = 'Alex'",
"UPDATE user_whereabouts SET columnName='' WHERE user_id = 1 OR name = 'Alex'");
for (String sql : sqls) {
Statement stmt = CCJSqlParserUtil.parse(sql);
Update update = (Update)stmt;
System.out.println("sql=" + stmt.toString());
System.out.println(" where=" + update.getWhere());
}
但你同样是对的,这个版本也有缺陷,例如,set col='testwhere test'
正确的方法是通过解析器()解析整个sql。使用JSqlParser这看起来像:
List<String> sqls = Arrays.asList("UPDATE user_accounts SET bio='This is my bio' WHERE user_id = 1 OR name = 'Alex';",
"UPDATE user_accounts SET whereColumn='' WHERE user_id = 1 OR name = 'Alex'",
"UPDATE user_whereabouts SET columnName='' WHERE user_id = 1 OR name = 'Alex'");
for (String sql : sqls) {
Statement stmt = CCJSqlParserUtil.parse(sql);
Update update = (Update)stmt;
System.out.println("sql=" + stmt.toString());
System.out.println(" where=" + update.getWhere());
}
但你同样是对的,这个版本也有缺陷,例如,set col='testwhere test'
正确的方法是通过解析器()解析整个sql。您需要在标记中分解查询,其中字符串文本是单个标记。WHERE子句的
WHERE
将是一个标记,而字符串文本中的WHERE
则不是(因为它是较大标记的一部分)。正则表达式“\s+WHERE\s+”确保“WHERE”是整个单词,但Mark的注释更合适。类似的事情需要标记化。您需要在标记中分解查询,其中字符串文本是单个标记。WHERE子句的WHERE
将是一个标记,而字符串文本中的WHERE
则不是(因为它是更大标记的一部分)。正则表达式“\s+WHERE\s+”确保“WHERE”是整个单词,但马克的注释更合适。类似的事情需要标记化。