MyBatis 的 #{} 和 ${} 的使用场景

MyBatis中可以使用#{} 或 ${} 两种语法填充 sql 参数。两种方法有不同的适用场景

#{}

使用 #{} 语法时,Mybatis 会使用预编译语句处理 sql,将参数以占位符的形式填充

select * from t_user where id = #{id}

等价于

PreparedStatements= conn.prepareStatement("select * from t_user where id = ?");

填充参数时,对于字符串类型会自动包含引号

能够防止 sql 注入,无论内容是什么,都以普通字符串参数去解析

不适用于group by、order by等这些需要列名的场景

因为字段以占位符形式填充,列名会包含引号,sql 会解析错误

<selectid="listOrderBy"resultType="top.originyy.interviewjava.case11.mybatis.entity.User">        select *        from t_user        order by #{sortField} #{sortType}</select>
    List<User> listOrderBy(@Param("sortField") String sortField, @Param("sortType") String sortType);

sql 等价于

select*from t_user orderby'username''desc'

结果来看排序是无效的

${}

${} 语法会在 sql 语句中插入未转义的字符串,将参数内容原封不动的替换占位符。

不会包含引号,所以使用这种方法时,需要在参数外自行添加一对引号。

<selectid="listByName2"resultType="top.originyy.interviewjava.case11.mybatis.entity.User">        select *        from t_user        where username='${name}'</select>

会引起 sql 注入问题,示例:

@TestpublicvoidlistByName2() {        List<User> users = userMapper.listByName2("zhangsan' or 1=1 -- ");        System.out.println(JSONUtil.toJsonStr(users));    }

sql 执行结果

${} 适用于根据参数插入列名、表名的场景

如:

  • 根据参数确定返回列

  • group by 分组列

  • order by 排序列和排序类型

  • 根据参数获取表名

<selectid="listOrderBy2"resultType="top.originyy.interviewjava.case11.mybatis.entity.User">        select *        from t_user        order by ${sortField} ${sortType}</select>
List<User> listOrderBy2(@Param("sortField") String sortField, @Param("sortType") String sortType);

但是使用${}有 sql注入风险,可以考虑使用动态 sql 根据参数判断实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穗余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值