ibatis中$和#的区别
2013-03-29 13:08
211 查看
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 方法调用
3如果配成$
可以查看com.ibatis.sqlmap.engine.execution.SqlExecutor---497行
3.1 sqlmap配置文件
3.2 ibatis会平凑出sql
SELECT * FROM c_admin WHERE 1=1 AND password = admin AND passwordtype = 1
4如果配成#
4.1 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);来设置参数
这样就很好理解#和$用法了。
以上个人调查结果仅供参考,如果有问题及时联系,非常感谢!
作者: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)); } |
可以查看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> |
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> |
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);来设置参数
这样就很好理解#和$用法了。
以上个人调查结果仅供参考,如果有问题及时联系,非常感谢!
相关文章推荐
- ibatis 中 $与#的区别
- JDBC iBatis Hibernate的区别及各自的优缺点总结
- iBatis与MyBatis区别
- hibernate与ibatis的区别
- IBatis中#和$的区别。
- MyBatis/Ibatis中#和$的区别
- MyBatis/Ibatis中#和$的区别
- mybatis相较于ibatis有什么优势?两者的区别在哪里?
- ibatis中resultMap和resultClass的区别 以及parameterClass 的取值
- mybatis ibatis区别
- iBatis中#和$占位符的区别
- ibatis mybatis区别-使用层面
- javaEE中Hibernate和ibatiS的区别总结
- IBatis与Hibernate的区别
- ibatis与hibernate的区别
- mybatis或ibatis中的#和$的区别?
- ibatis中井号跟美元符号区别(#.$)
- ibatis的$param$与#param#的区别
- ibatis 中的#与$的区别
- IBatis.Net使用总结(一)-- IBatis解决SQL注入(#与$的区别)