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 写法
xml 复制代码
<!-- UserMapper.xml -->
<select id="selectUserByIds" resultType="com.example.entity.User">
    SELECT * FROM user
    WHERE FIND_IN_SET(id, #{ids})
</select>
(2) Mapper 接口定义
java 复制代码
// UserMapper.java
import org.apache.ibatis.annotations.Param;
import java.util.List;
import com.example.entity.User;

public interface UserMapper {
    // 注意:参数名要和 XML 中的 #{ids} 对应,建议用 @Param 显式指定
    List<User> selectUserByIds(@Param("ids") String ids);
}
(3) 业务层调用
java 复制代码
// UserService.java
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import com.example.entity.User;
import com.example.mapper.UserMapper;

@Service
public class UserService {
    @Resource
    private UserMapper userMapper;

    public List<User> getUserListByIds() {
        // 传入逗号分隔的 ID 字符串
        String ids = "1,3,5";
        // 调用 Mapper 方法
        return userMapper.selectUserByIds(ids);
    }
}
2. 关键注意事项
  • 参数格式#{ids} 接收的必须是逗号分隔的字符串 (如 "1,3,5"),不能是 List 集合直接传入(如果是 List,需要先转成字符串)。
    示例(List 转字符串):

    java 复制代码
    List<Integer> idList = Arrays.asList(1,3,5);
    String ids = 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,性能更好:

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

对应的接口:

java 复制代码
List<User> selectUserByIds(@Param("ids") List<Integer> ids);

总结

  1. FIND_IN_SET(id, #{ids}) 中,#{ids} 必须传入逗号分隔的字符串,函数返回匹配的位置(非0则命中);
  2. 该写法无法使用索引,数据量大时优先用 MyBatis 的 <foreach> 拼接 IN
  3. 使用时注意参数类型:直接传 List 会报错,需转成字符串(或改用 IN 写法)。
相关推荐
一 乐5 分钟前
家政服务管理系统|基于springboot + vue家政服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·家政服务管理系统
碳基硅坊1 小时前
Spring AI:把大模型接进 Spring 应用
java·人工智能·spring ai
黄毛火烧雪下1 小时前
Java 核心知识点总结(一)
java·开发语言
技术小结-李爽2 小时前
【工具】Maven的下载、安装、使用
java·maven
极创信息2 小时前
Linux挖矿病毒深度清理实战教程,从进程隐藏、Rootkit驻留到彻底根除
java·大数据·linux·运维·安全·tomcat·健康医疗
努力成为AK大王2 小时前
并发编程的核心挑战、优化方案与核心知识点总结
java·开发语言·数据库
云烟成雨TD2 小时前
Agent Scope Java 2.x 系列【10】技能(Skill)
java·人工智能·agent
摇滚侠2 小时前
SpringMVC 入门到实战 DispatcherServlet 源码解读 92-95
java·后端·spring·maven·intellij-idea
键盘歌唱家3 小时前
Spring AI 入门分享:它和“直接调 API“到底差在哪
java·人工智能·spring
宸丶一3 小时前
Day 10:LangGraph - Agent 的图执行引擎
java·windows·python