今天要做一個關于模糊查詢的需求,以前用JDBC做精確查詢都是用 "SELECT * FROM test WHERE id = ?",所以用模糊查詢時理所當然的也用了"SELECT * FROM test WHERE name = '%?%'",但是查詢時一直提示java.sql.SQLException: Invalid parameter index 1.
Google一下原來ps不支持上面的寫法,應該先用占位符表示 "SELECT * FROM test WHERE name = ?",然后在傳參數的時候拼接ps.setString(1, "%"+參數+"%");
為了弄明白為什么PS不支持上面錯誤的表達方式,特意查看了一下源碼(基于Jtds驅動,如下為簡略代碼),原來PS再解析SQL語句時,是先判斷是否有 [ " ' 符號,如果有則把后面的字段都當做字符串處理,而后才判斷占位符。
String[] parse(boolean extractTable) throws SQLException {
switch (c) { case '{': escape(); isModified = true; break; case '[': case '"': case '/'': copyString(); break; case '?': copyParam(null, d); break; case '/': if (s+1 < len && in[s+1] == '*') { skipMultiComments(); } else { out[d++] = c; s++; } break; case '-': if (s+1 < len && in[s+1] == '-') { skipSingleComments(); } else { out[d++] = c; s++; } break; default: if (isSlowScan && Character.isLetter(c)) { if (keyWord == null) { keyWord = copyKeyWord(); if ("select".equals(keyWord)) { isSelect = true; } isSlowScan = extractTable && isSelect; break; } if (extractTable && isSelect) { String sqlWord = copyKeyWord(); if ("from".equals(sqlWord)) { // Ensure only first 'from' is PRocessed isSlowScan = false; tableName = getTableName(); } break; } } out[d++] = c; s++; break; }
}
新聞熱點
疑難解答