如何使用QueryRunner处理MySQL多筛选条件中的“全部”选项
处理多条件筛选中“全部”选项的方案
针对多条件筛选里“全部”选项的处理需求,这里提供几种简洁且安全的实现方案,避免逐个判断的繁琐:
方法一:动态拼接SQL(推荐,安全可控)
用StringBuilder动态构建SQL语句,仅将非“全部”的筛选条件加入WHERE子句,同时维护参数列表,既不会生成冗余条件,也能通过预编译避免SQL注入风险。
示例代码:
StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM table WHERE 1=1"); List<Object> params = new ArrayList<>(); // 处理性别筛选 String inputSex = request.getParameter("sex"); if (!"all".equals(inputSex)) { sqlBuilder.append(" AND sex = ?"); params.add(inputSex); } // 处理年龄筛选 String inputAge = request.getParameter("age"); if (!"-1".equals(inputAge)) { switch (inputAge) { case "under18": sqlBuilder.append(" AND age < 18"); break; case "18to35": sqlBuilder.append(" AND age BETWEEN 18 AND 35"); break; case "over35": sqlBuilder.append(" AND age > 35"); break; } } // 执行查询 String sql = sqlBuilder.toString(); List<User> results = queryrunner.query(sql, resultBean, params.toArray());
说明:
- 初始的
WHERE 1=1是为了简化后续AND条件的拼接,无需判断是否为第一个筛选条件。 - 仅对非“全部”的选项添加对应条件,参数列表动态维护,完全遵循预编译规范。
方法二:使用“条件恒成立”逻辑
如果不想动态拼接SQL,可以给每个筛选条件加上“选择全部时条件恒成立”的分支,让SQL语句固定通用,但需注意参数顺序匹配。
示例代码:
String sql = "SELECT * FROM table " + "WHERE (sex = ? OR ? = 'all') " + "AND ( " + " (? = '-1') " + " OR (? = 'under18' AND age < 18) " + " OR (? = '18to35' AND age BETWEEN 18 AND 35) " + " OR (? = 'over35' AND age > 35) " + ")"; String inputSex = request.getParameter("sex"); String inputAge = request.getParameter("age"); // 参数顺序需与SQL中的?一一对应 Object[] params = {inputSex, inputSex, inputAge, inputAge, inputAge, inputAge}; List<User> results = queryrunner.query(sql, resultBean, params);
说明:
- 选择“全部”时,对应的
OR分支会让该筛选条件恒成立,相当于忽略此条件。 - 缺点是筛选条件较多时,SQL会冗长,参数传递易出错,适合条件较少的场景。
方法三:封装工具类简化重复逻辑
若筛选条件极多,可封装工具方法统一处理条件拼接,减少重复代码。
示例工具方法:
public static void addCondition(StringBuilder sqlBuilder, List<Object> params, boolean condition, String sqlFragment, Object... paramValues) { if (condition) { sqlBuilder.append(" AND ").append(sqlFragment); for (Object param : paramValues) { params.add(param); } } }
使用示例:
StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM table WHERE 1=1"); List<Object> params = new ArrayList<>(); String inputSex = request.getParameter("sex"); addCondition(sqlBuilder, params, !"all".equals(inputSex), "sex = ?", inputSex); String inputAge = request.getParameter("age"); if (!"-1".equals(inputAge)) { switch (inputAge) { case "under18": addCondition(sqlBuilder, params, true, "age < 18"); break; case "18to35": addCondition(sqlBuilder, params, true, "age BETWEEN ? AND ?", 18, 35); break; case "over35": addCondition(sqlBuilder, params, true, "age > 35"); break; } }
通过工具类可大幅简化多条件场景下的代码冗余问题。
内容的提问来源于stack exchange,提问作者DuFei
相关产品推荐
相关产品推荐

