SpringMVC结合Mybatis传值

简介

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) 一般能用#的就别用$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值