如何将MySQL中的SELECT语句转换为Java可传入id参数的查询语句?
MySQL模糊查询转Java动态参数实现方案
以下是两种常用场景的实现方式,均可以避免SQL注入风险,支持动态传入id参数:
1. 原生JDBC实现
- 核心思路是预编译SQL用占位符,参数赋值阶段拼接模糊匹配规则,不要直接把参数拼接到SQL字符串中
// 1. 定义预编译SQL模板 String sql = "select * from tbl_user where path like ?"; // 2. 获取动态传入的id参数 Long id = 1001L; // 3. 拼接模糊查询需要的前后缀格式 String likeParam = "%," + id + ",%"; // 4. 预编译赋值执行 PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, likeParam); ResultSet rs = pstmt.executeQuery();
注意:直接拼接id到SQL字符串会存在SQL注入漏洞,禁止使用该写法
2. MyBatis实现
注解写法
@Select("select * from tbl_user where path like concat('%,', #{id}, ',%')") List<TblUser> queryUserByPathId(@Param("id") Long id);
XML写法
<select id="queryUserByPathId" resultType="com.example.domain.TblUser"> select * from tbl_user where path like concat('%,', #{id}, ',%') </select>
如果使用的MySQL版本不支持多参数concat函数,也可以在业务层提前拼接好参数再传入Mapper:
// 业务层拼接模糊查询参数 String likeParam = "%," + id + ",%"; // 调用Mapper方法 List<TblUser> userList = mapper.queryUserByPathId(likeParam);
对应简化后的Mapper SQL:
<select id="queryUserByPathId" resultType="com.example.domain.TblUser"> select * from tbl_user where path like #{likeParam} </select>
内容的提问来源于stack exchange,提问作者bin
相关产品推荐
相关产品推荐

