因为查询条件的不确定,用到了where 1=1
这样的权宜之计,
使用WHERE 1=1 之后,就不能使用索引了
且会遍历全表,显然在数据量比较大的情况下这是不能接受的
注:大部分版本的数据库还是对这个做了优化的,如果没有这个优化,可以参考如下操作
解决方法之一:在返回自定义sql之前检查sql,将不需要的where 1=1替换掉
public static String replaceForeverTrueSql(String originalSql) {
/**
* 先将不规范的空格去除 保证每个条件之间只含一个空格
*/
originalSql = originalSql.replaceAll(" +", " ");
/**
* 判断原始sql中是否包含1=1
*/
if (originalSql.contains("1=1")) {
// 包含则将sql 分为两段,以1=1为分隔符
String[] split = originalSql.split("1=1");
/**
* 主要看split[1]后半段,有没有包含And
*/
String afterHalfSql = split[1].trim();// 去除了前后的空格
/**
* 全部转换成大写 避免and 不规范的写法造成误判
*/
String afterHalfSqlUpper = afterHalfSql.toUpperCase();
if (afterHalfSqlUpper.startsWith("AND")) {// 说明1=1是多余的
/**
* 既然1=1 多余的 那就应该返回前半部分+ 除去第一个and的后半部分
*/
String[] s = afterHalfSql.split(" ", 2);
return split[0] + " " + s[1];
}
/**
* 包含1=1 但是没有and条件 这个情况连where都是多余的
*/
originalSql = originalSql.replace("1=1", "").replace("where", "").replace("WHERE", "");
return originalSql;
}
// 不包含直接返回
return originalSql;
}