mybatis框架下的sql使用preparedstatement进行sql的预处理操作,需要注意如下两点:
1.因为在mybaits的xml框架下写出的sql语句参数部分在执行时日志中会转变为?。在实际执行时的效果是 '参数',左右是加单引号的。所以使用?也就是参数进行拼接sql时要注意实际执行时参数的左右是加上单引号的。
例如
select count(1) from abc where #prefix#a#suffix# = 'a';
其中prefix参数为lower(
其中suffix参数为)
实际执行效果是
select count(1) from abc where 'lower('a')' = 'a'; --会报错
而不是
select count(1) from abc where lower(a) = 'a';
2.相同的sql在mybatis与数据库编辑器的执行效果可能不同,例如在mybaits中sql为
select count(1) from abc where a=#param#
其中param参数为ab'cd。
复制到数据库编辑器中sql为
select count(1) from abc where a='ab'cd'
会报错sql命令未正常结束,因为参数中的单引号作为特殊字符一般是成对出现,单独出现不能识别,在编辑器中需要使用'转义也就是写成''表示一个单引号,所以在数据库编辑器应写成
select count(1) from abc where a='ab''cd'
但是在mybatis下就不需要也不能对单引号进行转义,直接使用ab'cd即可。
由此推断mybaits与数据库编辑器对sql的解析引擎并不完全相同,把mybatis中的sql拿出来到数据库编辑器执行并不完全代表mybatis的实际执行情况,需要注意。