在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注入,不安全。
所以一般建议使用#,尽量不要使用$。另外配置文件还可以使用,在该符号内的语句不会被当成字符串处理,而直接当作sql语句。
网友评论