Kotlin中如何将列表作为SQL查询的参数?
问题描述
我有一个列表:
("item 1" , "item 2")
使用的SQL查询语句为:
SELECT * FROM table WHERE SYSTEM in (?)
我当前通过以下方式传递参数:
pstmt.setString(1,list)
我尝试过将列表内的值格式化为('item1' , 'item')的形式以适配SQL查询,但始终无效。因为传递参数时整个字符串会被加上引号,逗号也包含在引号内,导致查询异常。请问是否有可行的方法将列表作为SQL查询的参数?
可行解决方案
动态生成参数占位符(推荐)
根据列表的长度,在SQL里生成对应数量的?占位符,比如列表有2个元素,SQL就变成WHERE SYSTEM in (?, ?),再循环给每个占位符赋值:// 生成对应数量的?占位符 String placeholders = String.join(", ", Collections.nCopies(list.size(), "?")); String sql = "SELECT * FROM table WHERE SYSTEM in (" + placeholders + ")"; PreparedStatement pstmt = conn.prepareStatement(sql); // 循环设置参数 for (int i = 0; i < list.size(); i++) { pstmt.setString(i + 1, list.get(i)); }这种方式完全遵循预编译SQL的规范,能避免SQL注入,兼容性也最好。
利用数据库的数组参数支持(部分数据库可用)
如果你的数据库(比如PostgreSQL、Oracle)支持数组类型,可以直接传递数组参数,SQL语法需要对应调整:String[] arr = list.toArray(new String[0]); // 创建SQL数组 Array sqlArray = conn.createArrayOf("VARCHAR", arr); pstmt.setArray(1, sqlArray);对应的SQL要改成:
-- PostgreSQL 示例 SELECT * FROM table WHERE SYSTEM = ANY(?)避坑提醒
绝对不要手动拼接带引号的字符串到SQL里(比如直接写WHERE SYSTEM in ('item1','item2')),这种做法不仅会引发SQL注入风险,当列表元素包含单引号时还会直接导致SQL语法错误。
内容的提问来源于stack exchange,提问作者perpetter
相关产品推荐
相关产品推荐

