版权声明:https://blog.csdn.net/haochaoguo1988 https://blog.csdn.net/haochaoguo1988/article/details/83659617
公司用的是 hibernate 做数据库查询,其中 jar 包是这些。
在翻阅源码的时候有些问题不得解。在不懈努力下,以及前辈大神的指导下终于明白了。
String biz_stage = "007";
StringBuilder sql1 = new StringBuilder();
sql1.append(" SELECT C.TASK_HANDLER,C.STATUS FROM C_CLAIM_TASKS C WHERE C.CASENO = ? AND C.BIZ_STAGE = ?");
List<Map<String, Object>> list = databaseDao.findAllBySqlMap(sql1.toString(), caseNo, biz_stage);
InjectionCheckUtils.checkValidSql(sql);
final String fnSql = processQL(sql, values);
上面是重要代码(我有疑问的,以及大家阅读懂所必须的)。
SQL 正则校验(这块我弱项,没懂),然后就是 SQL 分析:
protected static String processQL(final String ql, final Object... values) {
String newQL = ql;
int pos = 0;
for (int i = 0; i < values.length; ++i) {
pos = newQL.indexOf(63, pos);
if (pos == -1) {
throw new IllegalArgumentException("params and values must match.");
}
if (values[i] instanceof Collection) {
newQL = String.valueOf(newQL.substring(0, pos)) + ":" + "queryParam" + i + newQL.substring(pos + 1);
}
++pos;
}
return newQL;
}
疑惑一:
pos = newQL.indexOf(63, pos);
为啥要定义 int 类型的数值 63 传进去。而且返回的值正好是 ‘?’ 所在的位置。
疑惑一续: 这个怎么会这样返回
if (value[i] == ch) {
return i;
}
校验 sql 正则方法
public static boolean isValidSql(final String sql) {
final String reg = "^[([\u4e00-\u9fa5])([a-zA-Z])([0-9])(\\s)([><=*!_'?:.(),-/%])(\\+)]*$";
final boolean valid = sql.matches(reg);
if (!valid) {
System.out.println("Invalid sql [{}]"+ (Object)sql);
}
return valid;
}
解惑:
char 与 int之间的转换