美文网首页
MyBatis中#与$的区别

MyBatis中#与$的区别

作者: aliex | 来源:发表于2016-08-03 00:35 被阅读942次

    在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语句。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/fkjfsttx.html