原始碼分析所得 char 與 int之間的轉換
阿新 • • 發佈:2018-11-15
公司用的是 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之間的轉換