MyBatis 的 #{} 和 ${} 的使用场景
创始人
2025-05-29 21:37:43

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 会解析错误

        select *        from t_user        order by #{sortField} #{sortType}
    List listOrderBy(@Param("sortField") String sortField, @Param("sortType") String sortType);

sql 等价于

select*from t_user orderby'username''desc'

结果来看排序是无效的

${}

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

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

        select *        from t_user        where username='${name}'

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

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

sql 执行结果

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

如:

  • 根据参数确定返回列

  • group by 分组列

  • order by 排序列和排序类型

  • 根据参数获取表名

        select *        from t_user        order by ${sortField} ${sortType}
List listOrderBy2(@Param("sortField") String sortField, @Param("sortType") String sortType);

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

相关内容

热门资讯

今年我省粮食产量达515.56... (来源:辽宁日报)转自:辽宁日报 图为在中储粮(盘锦)储运有限公司,装运粮食的重型卡车排起长队...
国家发展改革委部署促进投资止跌... (来源:辽宁日报)转自:辽宁日报 新华社北京12月13日电 (记者魏玉坤) 记者13日从全国发展和改...
江苏省实施《中华人民共和国森林... (来源:新华日报) 目 录 第一章 总则 第二章 森林、林木和林地权属管理...
姜堰数字化产品讲“活”理论 (来源:新华日报) □ 本报记者 卢佳乐 通讯员 姜宣 “王教授,您约我‘喝茶论道’,...
联合国维和部队在苏丹遇袭 6人... 转自:财联社【联合国维和部队在苏丹遇袭 6人死亡】财联社12月14日电,当地时间13日,苏丹武装部队...