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

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 根据参数判断实现

相关内容

热门资讯

我省部署防汛关键期地质灾害防治... (来源:黑龙江日报)转自:黑龙江日报 本报讯(记者杨桂华)近日,省自然资源厅召开2025年全...
北京密云:暴雨导致古北口村积水... (来源:千龙网)昨天凌晨,密云消防在古北口镇营救村民。8月4日,北京市发布暴雨红色预警。昨日(5日)...
新车被撞贬值能要求赔偿吗? 转自:北京日报客户端案情回顾夏女士新购买的车辆被李先生驾车撞损,接触部位严重损坏。经交管部门认定,李...
【主题跟踪】智能体:快人一步捕... (来源:Gangtise投研)在二级市场,每个交易日每一分钟可能藏着转瞬即逝的机会。分析师们需在海量...
因何而“燃”?如何预防?这份“... 转自:北京日报客户端8月5日2时许重庆市沙坪坝区一小区多辆电动自行车起火被烧成空壳01“小电驴”因何...
美财政部加码短期国债发行 稳定... 美国财政部宣布将于本周拍卖总额达1000亿美元、期限为四周的国库券,规模创历史新高。这项计划紧随本周...
刘作虎明确OPPO没有造车计划... 刘作虎表示,虽然现在好像车很火很热,但是跟 OPPO 目前业务选择的逻辑和原则是不一致的。刘作虎称,...
数字空间成为意识形态斗争的前沿... (来源:上观新闻)“数字文明”概念的提出,是深刻把握当今世界数字经济发展带来日新月异深刻变革的重大价...
七部门联合发文推动金融支持新型...   本报讯(记者 钟凌江)为深入贯彻党的二十届三中全会精神,落实全国新型工业化推进大会部署,加快金融...
太热了!伊朗下令关闭多个政府机... 据法新社8月5日援引伊朗国家媒体报道,由于高温天气和能源消耗增加,伊朗当局下令6日关闭德黑兰和多个省...