`
xiangxingchina
  • 浏览: 510214 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IBatis的SQLMap中#与$的区别

阅读更多

用$$ 有点宏替换的意思。
如下列映射:  
  <select   id="users"   resultMap="user">select   *   from   a   $name$</select>,则在传入参数可以queryForList("users",   "where   name='张三'");  

用##则是预编译处理,传入的是什么类型就是什么类型。(就是我们经常用的'?'占位符)
如下列映射:  
  <select   id="users"   resultMap="user">select   *   from   a   where   a.name=#name#</select>,你在传入参数时可以queryForList("users",   "张三");则生成的sql语句是select   *   from   a   where   a.name='张三'。

以下情况就必须使用$$:
  <typeAlias alias="rightsObj" type="com.*.model.Rights" />
  <select id="selectUserRights" parameterClass="rightsObj" resultMap="rightsMap" cacheModel="rightsCache">
        select r.* from RIGHTS r, USER_RIGHTS ur where ur.RIGHTS_ID=r.ID and ur.USER_ID=$userId$
  </select>

当userId不是rightsObj的属性,而是rightsObj派生类的属性时,如果还想像以下方式调用的话,就必须使用$$。
this.getSqlMapClientTemplate().queryForList("rights.selectUserRights", rightsVO);

需要注意的是$$不安全,容易被SQL注入攻击。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics