最近工作中为了防止sql注入问题让将使用" KaTeX parse error: Expected 'EOF', got '#' at position 14: { }"方式的语句改为"#̲{ }",检查了一下代码 代码…{}%'这种方式,在这里记录一下更改方法
方式一:
在UserMapper.java类中添加一个方法,如下:
//模糊查询
List<User> findByName(String name);
映射文件
在 UserMapper.xml 文件中加入配置,如下:
<!--模糊查询-->
<select id="findByName" parameterType="java.lang.String"
resultType="com.***.domain.User">
select * from user where name like #{name}
</select>
逻辑层语句
List userList = userDao.findByName("%张%")
方式二:
映射文件
在 UserMapper.xml 文件中加入配置,如下:
<!--
注意:在Oracle中, "" 只能用于起别名
-->
<select id="findByName" parameterType="java.lang.String"
resultType="com.***.domain.User">
select * from user where name like "%"#{name}"%"
</select>
方式三:
映射文件
在 UserMapper.xml 文件中加入配置,如下:
<!--
注意:在Oracle中, concat()只支持两个参数
-->
<select id="findByName" parameterType="java.lang.String"
resultType="com.***.domain.User">
select * from user where name like concat(concat('%',#{name}),'%')
</select>
方式四
映射文件
在 UserMapper.xml 文件中加入配置,如下:
<!-- 注意: ${} 的形式中间key必须填写value-->
<select id="findByName" parameterType="java.lang.String"
resultType="com.***.domain.User">
select * from user where name like "%${value}%"
</select>
总结:
第四种存在sql注入的风险:
#表示占位符, 相当于JDBC中的?, 底层工作的是PreparedStetement对象, SQL只编译一次, 而且没有SQL注入问题
#当传入的参数为一个简单类型时, #{}可以随便写
$ 表示字符串拼接, 底层工作的是Statement对象, 每次都会重新编译, 而且存在 SQL 注入问题
$ 当传入的参数为一个简单类型时, ${}只能写value