如何用JdbcTemplate实现多LIKE条件AND查询并返回字符串列表
如何修改Java代码实现多LIKE条件的AND逻辑查询?
修改后的完整代码
import org.springframework.jdbc.core.JdbcTemplate; import java.util.ArrayList; import java.util.Collections; import java.util.List; public List<String> readFileNamesBy(String tableName, String categoryName, List<String> filterValues) { // 处理空过滤条件:根据业务需求调整,这里返回空列表 if (filterValues == null || filterValues.isEmpty()) { return Collections.emptyList(); } // 动态构建多AND条件的WHERE子句 StringBuilder whereClause = new StringBuilder(); for (int i = 0; i < filterValues.size(); i++) { if (i > 0) { whereClause.append(" AND "); } whereClause.append(categoryName).append(" LIKE ?"); } // 拼接完整SQL,仅查询需要的FILE_NAME字段(优化原代码SELECT *的冗余) String sql = "SELECT FILE_NAME FROM " + tableName + " WHERE " + whereClause.toString(); JdbcTemplate jt = new JdbcTemplate(dataSource); // 单次执行查询,用Java 8 Lambda简化结果映射 return jt.query(sql, filterValues.toArray(), (rs, rowNum) -> rs.getString("FILE_NAME")); }
关键修改说明
动态构建AND条件
根据filterValues的长度,循环拼接categoryName LIKE ?语句,并用AND连接,确保所有LIKE条件同时生效,替代原代码循环单条件查询的OR逻辑。优化SQL查询
将原代码的SELECT *改为SELECT FILE_NAME,只查询需要的字段,减少数据传输量,提升查询效率。单次查询替代循环查询
把所有过滤值作为参数数组传入jt.query,仅执行一次数据库查询,直接得到满足所有AND条件的结果集。Java 8特性适配
使用Java 8支持的Lambda表达式作为RowMapper,简化结果集到List<String>的映射,符合Java 8环境要求。
调用示例(无需修改)
import java.util.Arrays; import java.util.List; List<String> filterValues = Arrays.asList("%101G%", "%14F%", "%701G%"); List<String> hi = dbUtil.readFileNamesBy("test.new_table","IDS", filterValues);
注意事项
- 原代码中直接拼接
tableName和categoryName存在SQL注入风险,如果这两个参数来自不可信输入,需要添加白名单校验或其他防护措施。 - 空过滤条件的处理逻辑可根据业务需求调整,比如返回全表的FILE_NAME列表。
内容的提问来源于stack exchange,提问作者ju09
相关产品推荐
相关产品推荐

