论坛首页 综合技术论坛

ibatis中,关于$和#的微妙关系

浏览 7482 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-02  
最近,在使用Ibatis做项目时,发现以下问题:

对于以下的SQL文

///////////////////////////////////////////////////////////////////////////////////////////////////////////
CREATE TABLE $creMotoGyomTableName$ AS SELECT * FROM $creBackUpTableName$ WHERE TEISYUTU_HOKENNO = #hokenno#
///////////////////////////////////////////////////////////////////////////////////////////////////////////

如果,变量hokenno的两边是用#括起来的话,那么就会报Ora-01027: bind variables not allowed for data definition operations的错误,但是把#修改为$以后的话,就没有这个问题了。

鄙人知道$在Ibatis中是会把两边的单引号【'】去掉的,而#是不会去掉【'】。

这是什么问题呢?这个地方为什么不能用#呢?
   发表时间:2010-08-02  
这么理解吧:

$ 用来标示sql 语法的一部分  比如  select * from $tablename$;
# 用来标示sql里数据部分。 比如oralce的绑定变量

另外$不建议使用,如果你乱来, 导致大量的sql注入安全漏洞。
0 请登录后投票
   发表时间:2010-08-02  
ibatis2我不清楚,但是ibatis3官方文档是有明确说明,#{} 会导致底层使用PreparedStatement,${}只是字符串替换
0 请登录后投票
   发表时间:2010-08-02  
sdh5724 写道
这么理解吧:

$ 用来标示sql 语法的一部分  比如  select * from $tablename$;
# 用来标示sql里数据部分。 比如oralce的绑定变量

另外$不建议使用,如果你乱来, 导致大量的sql注入安全漏洞。


关于这点语法,我是知道的,现在的问题是,为什么这块会报绑定错误的error呢?
0 请登录后投票
   发表时间:2010-08-02  
racnow 写道
ibatis2我不清楚,但是ibatis3官方文档是有明确说明,#{} 会导致底层使用PreparedStatement,${}只是字符串替换


官方只是给出了这两个的基本语法区别,关于更深的东西是没有详细解说的,所以现在出现了,当使用我上述的SQL文
的时候,会出现绑定异常之类的错误,这是为什么?
0 请登录后投票
   发表时间:2010-08-03  
打印一下生成后的SQL,看看就明白了。
从你描述中觉得应该是生成后的SQL语法是有问题的,所以才会导致错误产生。
如果你使用了Log4j,请使用Debug模式使SQL输出。
0 请登录后投票
   发表时间:2010-08-03  
是呀,打印看看,或者读读文档
0 请登录后投票
   发表时间:2010-08-04  
建议检查下TEISYUTU_HOKENNO列的SQL类型是啥,hokenno属性的java类型又是啥。
我怀疑TEISYUTU_HOKENNO是数值类型,而hokenno是字符串。呵呵。
0 请登录后投票
   发表时间:2010-08-04  
miaow 写道
建议检查下TEISYUTU_HOKENNO列的SQL类型是啥,hokenno属性的java类型又是啥。
我怀疑TEISYUTU_HOKENNO是数值类型,而hokenno是字符串。呵呵。


TEISYUTU_HOKENNO
hokenno
都是字符类型的。不存在类型不一致的情况。
0 请登录后投票
   发表时间:2010-08-05  
hokenno是什么形式?举个例子吧
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics