news 2026/5/1 5:56:48

FIND_IN_SET()方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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写法)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:02:37

springboot_ssm842智慧家政在线预约管理系统的设计与实现ssm

目录具体实现截图智慧家政在线预约管理系统的设计与实现系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 智慧家政在线预约管理系统的设计与实现 该系统基于SpringBoot和SSM框架开发&#xff0c;…

作者头像 李华
网站建设 2026/5/1 4:07:03

微信小程序生命周期

在微信小程序开发中&#xff0c;生命周期是贯穿全局的核心逻辑&#xff0c;决定了代码在不同阶段的执行时机。无论是初始化全局数据、请求接口、操作DOM&#xff0c;还是释放资源&#xff0c;都需要依赖生命周期钩子函数精准控制。 小程序生命周期分为两大维度&#xff1a;应用…

作者头像 李华
网站建设 2026/5/1 4:17:09

Java毕设项目:基于springboot的元宇宙平台上的消费扶贫专柜管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/1 4:26:54

计算机Java毕设实战-基于springboot的元宇宙平台上的消费扶贫专柜管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/1 4:25:04

基于STM32的健康监测系统设计与实现

基于STM32的健康监测系统设计与实现 摘要 随着人口老龄化进程的加速&#xff0c;老年人健康监测需求日益增长。传统健康监测方式存在监测频率低、数据不准确、响应滞后等问题&#xff0c;难以及时发现健康风险。本文设计并实现了一种基于STM32F103C8T6微控制器的健康监测系统…

作者头像 李华
网站建设 2026/5/1 5:01:02

【计算机毕业设计案例】基于vue+springboot的隧道云视频监控管理信息平台设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华