mybatis中的字符串替换
默认情况下,使⽤ #{} 格式的语法会导致 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");
sql语句替换表中内容User userOfEmail = userMapper.findByColumn("email", "noone@nowhere");
这个想法也同样适⽤于⽤来替换表名的情况。
提⽰ ⽤这种⽅式接受⽤户的输⼊,并将其⽤于语句中的参数是不安全的,会导致潜在的 SQL 注⼊攻击,因此要么不允许⽤户输⼊这些字段,要么⾃⾏转义并检验。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论