MyBatis中#与$的区别

摘要:在mybatis的映射配置文件中经常可以看到#与$符号,这两种符号都可以用于传递参数,那么它们之间的区别是什么呢?

在mybatis的映射配置文件中经常可以看到#与$符号,这两种符号都可以用于传递参数,那么它们之间的区别是什么呢?

下面看几个例子:

select name,age from user where id>#userId# order by name;

传入参数userId=2,那么mybatis会把配置文件中上面的语句转化成:

select name,age from user where id>2;


select name,age from user where id>1 order by $fieldname$;

传入参数fieldname=age,那么mybatis会把上面的语句转化成:

select name,age from user where id>1 order by age;

假如把上面的例子修改一下:

select name,age from user where id>$userId$ order by #fieldname#;

传入参数userId=2,fieldname=age,那么mybatis会把配置文件中上面的语句转化成:

select name,age from user where id>2 order by 'age';

明显这样的转化生成的sql语句是有语法错误的。


其实,#相当于使用Preparement语句来安全地设置值,执行sql类似于:

PreparedStatement ps = conn.prepareStatement(sql);

ps.setInt(1,userId);

这样可以防止sql注入,更加安全。


$相当于原样把参数的值输入,直接把参数值拼接在sql语句后面,mybatis不会修改或者转义字符串,执行sql类似于:

Statement st = conn.createStatement();

ResultSet rs = st.executeQuery("select name,age from user where id>2 order by "+age);

这种方式很容易受到sql注入,不安全。


所以一般建议使用#,尽量不要使用$。另外配置文件还可以使用<![CDATA[]]>,在该符号内的语句不会被当成字符串处理,而直接当作sql语句。


文章版权为朗度云所有,转载必须声明出处,否则保留追究法律责任。

版权说明:如无特殊说明,文章均为本站原创,如需转载请注明出处

本文标题:MyBatis中#与$的区别

本文地址:http://www.wolfbe.com/detail/201608/267.html

本文标签: mybatis java sql

相关文章

感谢您的支持,朗度云将继续前行

扫码打赏,金额随意

温馨提醒:打赏一旦完成,金额无法退还,请谨慎操作!

扫二维码 我要反馈 回到顶部