以前动态查询的数据的时候,多个查询条件则需要动态拼接sql,因此许多开发人员就想到一个捷径:为sql指定一个永远为true的条件(比1=1)这样就不用考虑where语句是否存在的问题了。这看似优美的解决了问题,殊不知这样可能会造成非常大的性能损失,因为使用了“1=1”这样的过滤条件后数据库就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描以比较此行是否满足过滤条件,当表中的数据量非常大的时候效率会显得非常慢。因此如果数据检索对性能有比较高的要求就不要使用这种“简便”的方法进行检索,下面给出方案,伪代码实现如下:
- private void doQuery(){
- Boolean hasWhere = false;
- StringBuilder sql = new StringBuilder("select * from db_users");
- if(查询条件1){
- hasWhere = appendWhereIfNeed(sql,hasWhere);
- sql.append("uname like '%"+uname+"%'");
- }if(查询条件2){
- hasWhere = appendWhereIfNeed(sql,hasWhere);
- sql.append("uage = "+uage);
- }
- executeSql(sql);
- }
- private Boolean appendWhereIfNeed(StringBuilder sql,Boolean hasWhere){
- if(hasWhere == false){
- sql.append("where ");
- }else{
- sql.append("and");
- }
- }