简介
SpringMVC 向 Mybatis 传递参数的时候,一般参数是映射到实体类的属性,这样 Mybatis 就可以通过对象相应的 get 方法获取到值,比如下面这种
<delete id="delete" parameterType="int">
delete from t_blog where id = #{id}
</delete>
但是有的时候传入的值不一定是实体类的属性,又该怎么办呢?如下介绍了两种简单的方案
方案一:SQL 语句中使用下标的方式标注参数
<delete id="delete" parameterType="int">
delete from t_blog where id = ${1} and author = ${2}
</delete>
方案二:通过 Map 传递多个值
BlogController.class
@GetMapping("/list")
public List<Blog> list(@RequestParam("params") Map<String, String> params) {
return blogService.list(params);
}
Blog.xml
<select id="list" parameterType="java.util.Map" resultType="com.dufu.model.Blog">
select * from t_blog where 1 = 1
<if test="null != email">
and author = '${email}'
</if>
<if test="null != title">
and title = '${title}'
</if>
... ...
</select>
这里判断语句中的条件直接对应 Map 中的 key 值
方案三:新建参数对应属性的实体类作为参数接收对象,此方法和 Map 类似,此处就不赘述了
补充:MyBatis/Ibatis中 # 和 $ 的区别
(1) # 将传入的数据都当成一个字符串,会自动对传入的参数类型解析再添加到 sql 中;如:order by #{user_id},如果传入的值是 123,那么解析成 sql 时的值为 order by “123”, 如果传入的值是 dufu,则解析成的 sql 为order by “dufu”
(2) $ 将传入的数据直接显示生成在 sql 中;如:order by ${user_id},如果传入的值是123,那么解析成 sql 时的值为order by 123, 如果传入的值是 dufu,则解析成的 sql 为 order by dufu
(3) #方式能够很大程度防止sql注入
(4) $方式无法防止Sql注入
(5) $方式一般用于传入数据库对象,例如传入表名, 排序的时候常用,例如传入的参数为 DESC / ASC
(6) 一般能用#的就别用$