当前位置: 首页 > news >正文

FIND_IN_SET()方法

一、基础用法说明

FIND_IN_SET(str, strlist)函数的作用是:在strlist(逗号分隔的字符串)中查找str的位置,返回值是数字(找到则返回位置,从1开始;没找到返回0)。
结合 MyBatis 的#{ids}是为了安全地传入参数,避免 SQL 注入。

二、完整使用示例

1. 场景:根据多个 ID 批量查询数据

假设你有一张user表,想通过多个用户 ID(如 1,3,5)查询对应的用户信息,就可以用这个函数。

(1) MyBatis Mapper XML 写法
<!-- UserMapper.xml --><selectid="selectUserByIds"resultType="com.example.entity.User">SELECT * FROM user WHERE FIND_IN_SET(id, #{ids})</select>
(2) Mapper 接口定义
// UserMapper.javaimportorg.apache.ibatis.annotations.Param;importjava.util.List;importcom.example.entity.User;publicinterfaceUserMapper{// 注意:参数名要和 XML 中的 #{ids} 对应,建议用 @Param 显式指定List<User>selectUserByIds(@Param("ids")Stringids);}
(3) 业务层调用
// UserService.javaimportorg.springframework.stereotype.Service;importjavax.annotation.Resource;importjava.util.List;importcom.example.entity.User;importcom.example.mapper.UserMapper;@ServicepublicclassUserService{@ResourceprivateUserMapperuserMapper;publicList<User>getUserListByIds(){// 传入逗号分隔的 ID 字符串Stringids="1,3,5";// 调用 Mapper 方法returnuserMapper.selectUserByIds(ids);}}
2. 关键注意事项
  • 参数格式#{ids}接收的必须是逗号分隔的字符串(如"1,3,5"),不能是 List 集合直接传入(如果是 List,需要先转成字符串)。
    示例(List 转字符串):
    List<Integer>idList=Arrays.asList(1,3,5);Stringids=String.join(",",idList.stream().map(String::valueOf).toArray(String[]::new));
  • 性能提示FIND_IN_SET()无法使用索引,数据量大时性能较差,建议优先用IN (1,3,5)(MyBatis 中可通过<foreach>实现)。
  • 返回值逻辑
    • FIND_IN_SET(3, '1,3,5')→ 返回 2(第2个位置)
    • FIND_IN_SET(6, '1,3,5')→ 返回 0(未找到)

三、对比:FIND_IN_SET vs IN(推荐写法)

如果你的参数是 List 集合,更推荐用<foreach>拼接IN,性能更好:

<selectid="selectUserByIds"resultType="com.example.entity.User">SELECT * FROM user WHERE id IN<foreachcollection="ids"item="id"open="("separator=","close=")">#{id}</foreach></select>

对应的接口:

List<User>selectUserByIds(@Param("ids")List<Integer>ids);

总结

  1. FIND_IN_SET(id, #{ids})中,#{ids}必须传入逗号分隔的字符串,函数返回匹配的位置(非0则命中);
  2. 该写法无法使用索引,数据量大时优先用 MyBatis 的<foreach>拼接IN
  3. 使用时注意参数类型:直接传 List 会报错,需转成字符串(或改用IN写法)。
http://www.jsqmd.com/news/280739/

相关文章:

  • GPEN人像修复实战:一张模糊照如何重生
  • springboot_ssm838学生过程性作业评价系统ssm
  • springboot_ssm845股票基金分析系统的设计与实现ssm
  • 用AI写测试用例?这5个提示词模板让你效率翻倍
  • 基于微信小程序的环保餐具销售系统【源码+文档+调试】
  • springboot_ssm846农产品特产品网络交易平台设计与实现ssm
  • springboot_ssm839学校招生系统ssm
  • 微信小程序生命周期
  • 【课程设计/毕业设计】基于springboot的元宇宙平台上的消费扶贫专柜管理系统【附源码、数据库、万字文档】
  • 基于ASP.NET的医院预约挂号管理系统源码文档部署文档代码讲解等
  • springboot_ssm847儿童福利院管理系统ssm
  • 维普AIGC检测高到离谱?我帮你拆解原因
  • 5个月学习GIS开发计划:带你揭秘特训营都在学习哪些内容?
  • 单点登录(SSO)
  • 实测6款降AI工具:维普67%是怎么降到9%的
  • 【毕业设计】基于springboot的小学数学错题管理及推荐系统设计与实现(源码+文档+远程调试,全bao定制等)
  • React 高阶组件
  • 【毕业设计】基于springboot的房产交易服务平台的设计与实现(源码+文档+远程调试,全bao定制等)
  • 基于微信小程序的电影院订票选座系统【源码+文档+调试】
  • 【毕业设计】基于springboot的元宇宙平台上的消费扶贫专柜管理系统(源码+文档+远程调试,全bao定制等)
  • 2026 年 AI PPT 工具深度复盘:工具间的效率鸿沟与职场应用场景分析
  • 一次过维普检测:最值得用的降AI处理工具清单
  • 【毕业设计】基于springboot的医药管理系统(源码+文档+远程调试,全bao定制等)
  • 用java实现简易计算器_java窗口简易计算器,零基础入门到精通,收藏这篇就够了
  • 学校用维普检测,这6款降AI工具更稳
  • Vue 中 v-for 与 v-if 优先级
  • 新能源储能设备人机交互利器:高可靠串口屏的全链路适配方案解析
  • 基于 YOLOv8 的焊缝表面缺陷智能检测系统实战(附完整训练与可视化界面)
  • 6款降AI工具维普实测,差距比你想的大
  • 1-21午夜盘思