1. 程式人生 > >原始碼分析所得 char 與 int之間的轉換

原始碼分析所得 char 與 int之間的轉換

 公司用的是 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之間的轉換