您的位置:首页 > 其它

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 方法调用

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);来设置参数
这样就很好理解#和$用法了。

以上个人调查结果仅供参考,如果有问题及时联系,非常感谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: