问题出现场景
- 最近练习的小的项目中,有一个模糊查询的功能。在不选择任何筛选项的时候,查询全部的信息。前端选择的时候,每增加一项筛选项,查询的信息sql就会动态增加一个where条件,并且从全部的信息中自动筛选出符合条件的信息呈现出来。
- 在这里,Sql语句不是一成不变的。而是随着前端对于筛选项的选择而产生变化的。那么,如何能够写出一条动态的sql语句呢?
问题的思考
- 首先想到的是 if 判定。比如有2个筛选项,就进行4次判定(一个不选,选了其一,两个都选)。然后写4个相对应的完整的Sql语句。但是显然,代码量很多,很麻烦。
- 但是好像 sql 语句只需要在基础的全部查询的条件上加入一些条件就成了,能不能判定一下参数,如果有新的筛选参数,就加一些新的条件。否则,就执行最原始的?
- 但是问题又来了,对于例如 (select * from student where) 这个 sql 句子之后应该怎么写呢?写4个 ? 号吗 (select * from student where a=? and b=? and c=? and d=?),但是怎么为这 4个 ?号赋值呢。而且这4个参数不一定同时存在,最少可能一个都没有。
- 是否可以让 sql 语句停留在(select * from student where)这个样子,然后通过判定加入 (and x=? )这样的拼接 sql 语句呢。
- 尝试之后发现 (select * from student where)这个 sql 语句跟 (select * from student )在数据库中并无差别,系统认为这两者一样。在拼接 sql 语句的时候,就变成了(select * from student a=?)这种形式。显然,where 被忽视掉了。那怎么样才能让 where 恒存在呢?
问题的解决
- 这里就引入了 1=1这个东西
- 将上文提到的(select * from student where)改为(select * from student where 1=1)就实现了这样的效果。倘若不加任何东西,系统会认为这个 sql 语句就是(select * from student )。但是注意,如果你拼接了一些 sql 语句,它呈现给系统的时候 where 是不会消失的,就变成了(select * from student where a=x) 这种。
- 在进行判定的时候,拼接的 sql 语句可以是 ( and x=y )这样的形式。这样,sql 会随着你拼接的数量而进行更多的筛选。即使没有任何筛选参数,也会执行最初始的 sql 语句。
- 通过这样的方式,就实现了 sql 查询时候,模糊查询条件下的 sql 语句拼接的效果
- 我的下一篇博文讲了具体的应用和Dao层的代码部分,有兴趣可以移步:https://blog.csdn.net/qq_36654606/article/details/86631569