欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis Xml映射文件之字符串替换方式

程序员文章站 2022-09-16 23:42:26
目录mybatis xml映射文件字符串替换字符串替换举个例子mybatis中字符串替换问题mybatis xml映射文件字符串替换字符串替换默认情况下,使用 #{} 格式的语法会导致 mybatis...

mybatis xml映射文件字符串替换

字符串替换

默认情况下,使用 #{} 格式的语法会导致 mybatis 创建 preparedstatement 参数占位符并安全地设置参数(就像使用 ? 一样)。 这样做更安全,更迅速,通常也是首选做法,不过有时你就是想直接在 sql 语句中插入一个不转义的字符串。

比如,像 order by,你可以这样来使用:

order by ${columnname}

这里 mybatis 不会修改或转义字符串。

当 sql 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。

举个例子

如果你想通过任何一列从表中 select 数据时,不需要像下面这样写:

@select("select * from user where id = #{id}")
user findbyid(@param("id") long id);
 
@select("select * from user where name = #{name}")
user findbyname(@param("name") string name);
 
@select("select * from user where email = #{email}")
user findbyemail(@param("email") string email); 
// and more "findbyxxx" method

可以只写这样一个方法:

@select("select * from user where ${column} = #{value}")
user findbycolumn(@param("column") string column, @param("value") string value);

其中 ${column} 会被直接替换,而 #{value} 会被使用 ? 预处理。 因此你就可以像下面这样来达到上述功能:

user userofid1 = usermapper.findbycolumn("id", 1l);
user userofnamekid = usermapper.findbycolumn("name", "kid");
user userofemail = usermapper.findbycolumn("email", noone@nowhere.com);

这个想法也同样适用于用来替换表名的情况。

提示:用这种方式接受用户的输入,并将其用于语句中的参数是不安全的,会导致潜在的 sql 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

mybatis中字符串替换问题

默认情况下,使用#{}格式的语法会导致mybatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法!

有时只想直接在sql语句中插入一个不改变的字符串.比如,像order by,你可以这样来使用:order by ${column}

这里mybatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的sql注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查!

错误方式:

order by fupdated ${sort, jdbctype=varchar}, fcreated ${sort, jdbctype=varchar}

正确方式:

order by fupdated ${sort}, fcreated ${sort}

前提条件:请对sort进行必要验证,防止sql攻击问题!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。