ibatis中$和#的區別
作者:lg
1根據來源
通過看ibatis-2.3.4.726源碼com.ibatis.sqlmap.engine.execution.SqlExecutor可以看到方法
executeQuery(StatementScope statementScope,Connection conn, String sql, Object[] parameters, int skipResults, intmaxResults, RowHandlerCallback callback) throws SQLException {瞭解一些內部實現,下面逐步介紹
2 方法調用
publicstaticvoid main(String[] args)throws SQLException{ Map map = new HashMap(); map.put("tablename","c_admin"); map.put("password","admin"); map.put("passwordtype","1"); List list = testMain.selectAdmintByName(map); int len = list.size(); for(int i=0;i<len;i++){ System.out.println(list.get(i)); }
// System.out.println(testMain.searchAdminTotal(map)); }
|
3如果配成$
可以查看com.ibatis.sqlmap.engine.execution.SqlExecutor---497行
3.1 sqlmap配置文件
<sqlMapnamespace="defaultBusiness"> <resultMapid="cadminresult"class="java.util.HashMap"> <resultproperty="admin"column="admin"/> <resultproperty="password"column="password"/> <resultproperty="passwordtype"column="passwordtype"/> </resultMap> <selectid="searchAdminList"parameterClass="java.util.Map"resultMap="cadminresult"> <dynamicprepend=""> <isNotEmptyproperty="tablename"prepend=""> SELECT * FROM $tablename$ WHERE 1=1 </isNotEmpty>
<isNotNullprepend="AND"property="password"> password = $password$ </isNotNull>
<isNotNullprepend="AND"property="passwordtype"> passwordtype = $passwordtype$ </isNotNull> </dynamic> </select> </sqlMap> |
3.2 ibatis會平湊出sql
SELECT * FROM c_admin WHERE 1=1 AND password = admin AND passwordtype = 1
4如果配成#
4.1 sqlmap配置文件
<sqlMapnamespace="defaultBusiness"> <resultMapid="cadminresult"class="java.util.HashMap"> <resultproperty="admin"column="admin"/> <resultproperty="password"column="password"/> <resultproperty="passwordtype"column="passwordtype"/> </resultMap> <selectid="searchAdminList"parameterClass="java.util.Map"resultMap="cadminresult"> <dynamicprepend=""> <isNotEmptyproperty="tablename"prepend=""> SELECT * FROM $tablename$ WHERE 1=1 </isNotEmpty>
<isNotNullprepend="AND"property="password"> password = #password# </isNotNull>
<isNotNullprepend="AND"property="passwordtype"> passwordtype = #passwordtype# </isNotNull> </dynamic> </select> </sqlMap> |
4.2 ibatis會拼湊sql
SELECT * FROM c_admin WHERE 1=1 AND password = ? AND passwordtype = ?
5 分析結果
從1,2,3,4可以看出,#被解析出?,$被直接替換成了裸露的值admin(如上例),所以tablename不能用#來包括,其ibatis的最低層是藉助我們熟悉的PreparedStatementps = conn.prepareStatement(sql);來執行的,通過ps.setString(i, param);等方法來設置的?裏面的條件,ibatic會根據傳入參數,並藉助StringTypeHandler.java,LongTypeHandler.java 等類來保持參數的原始類型,譬如password是java.lang.String ,passwordtype是java.lang.Interger,再分別調用ps.setString(i, param);和ps.setInt(i, param);來設置參數 這樣就很好理解#和$用法了。
以上個人調查結果僅供參考,如果有問題及時聯繫,非常感謝!