我就废话不多说了,大家还是直接看代码吧~

<select id="findActiveBlogLike" resultType="Blog">SELECT * FROM BLOGWHERE<if test="state != null">state = #{state}</if>
</select>

如果state参数为空时,最终生成SQL语句为

SELECT * FROM BLOG

WHERE

执行会出错,当然,你可以在where 后加一个1=1,改成

<select id="findActiveBlogLike" resultType="Blog">SELECT * FROM BLOGWHERE 1=1<if test="state != null">and state = #{state}</if>
</select>

但是这种做法有一个最大的弊端,就是导致数据表上的索引失效,如果有索引的话。而且还是一个垃圾条件

所以正确的做法应该是:

使用<where>标签 解决这个问题

where标签会自动处理第一个为null时候的and问题

<select id="findActiveBlogLike" resultType="Blog">SELECT * FROM BLOG<where><if test="state != null">and state = #{state}</if></where>
</select>

补充知识:mybatis @Select注解中当参数为空则不添加该参数的判断

如下所示:

@Select("select * from “+DEPTTABLE+” ")

List selectAllDept();

在mybatis中不用xml文件的形式,selectDept方法执行的就是上面的Sql语句,如果是遇到动态的语句就需要用到下面的形式。

1.用Provider去实现SQL拼接:

@SelectProvider(type=DeptDynaSqlProvider.class,method="count")Integer count(Map<String, Object> params);
//DeptDynaSqlProvider.class 类中的方法
public String count(Map<String, Object> params){return new SQL(){{SELECT("count(*)");FROM(DEPTTABLE);if(params.get("dept") != null){Dept dept = (Dept) params.get("dept");if(dept.getName() != null && !dept.getName().equals("")){WHERE(" name LIKE CONCAT ('%',#{dept.name},'%') ");}}}}.toString();}

2.还有一种方式是用script标签包围,像xml语法一样书写

@Select({"<script>","SELECT * FROM tbl_order","WHERE 1=1","<when test='title!=null'>","AND mydate = #{mydate}","</when>","</script>"})

**注意:**方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。

复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似Spring JDBC Template。

巧妙mybatis避免Where 空条件的尴尬相关推荐

  1. 头指针为head的带头结点的单链表判空条件head->next==null?

    由于考研需求,又乖乖滚回来捧起数据结构了,一年没碰书,忘得都差不多了,还得捡回来,哭死了. 进入正题,为何头指针为head的带头结点的单链表判空条件head->next==null?其实一开始这 ...

  2. 【vue,SpringBoot,Mybatis】 关于多条件搜索表单

    背景 在做小项目的运营后台时,需要制作多条件搜索的表单,要求是:支持任一字段搜索或几个字段的搜索,当无字段搜索时返回所有数据.视图如下 在收集表单的数据之后,使用axios发起post请求,代码如下: ...

  3. MyBatis中的多条件查询

    mybatis的多条件查询是后台开发中常见的一种需求,下面直接展示需要实现的效果图: 如上图,我们需要根据四个条件来查询简历信息,而且需求允许某些条件为空,还有一个就是时间段的查询,如果我们使用的常规 ...

  4. mybatis test把空字符串解析为0

    直接入主题: 一个mybatis的Mapper文件 xxxxMapper(Map<String,Object>params); 相关xml代码片段: <if test="p ...

  5. xampp mysqli_query and后的条件不行_Java笔记不用!null作为判空条件

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在Java语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要 ...

  6. mybatis的if test 条件判断

    转载自 https://blog.csdn.net/xxlian1201/article/details/52759349 在使用 MyBatis if 进行条件判断时,一直报错: <if te ...

  7. mybatis动态SQL多条件查询1 - if 标签

    Mybatis框架的动态SQL技术是一种根据特定条件动态拼接SQL语句的过程.它的存在是为了解决拼接SQL语句字符串的痛点问题.创建新的Mapper接口和新的mapper映射文件. 目录 1.创建Dy ...

  8. Mybatis Plus使用,条件拼装、自定义分页、多数据源

    MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生.文档地址:https://mybatis.plus/gui ...

  9. mybatis通用的多条件筛选查询

    在开发项目阶段中为了方便往后的维护与灵活使用,做一个通用的查询功能比较便捷.在mybatis里面动态的拼接sql完成多条件查询,一些特殊字符可以采用一些其他代码代替. 封装格式如下 [{"a ...

最新文章

  1. 06章 映射一对多双向关联关系、以及cascade、inverse属性
  2. 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)
  3. leetcode算法题--反转字符串
  4. manacher马拉车算法
  5. 用idea插件将一个spring boot项目部署到docker容器里运行
  6. FreeMaker+Xml导出word(含图片)
  7. 数据结构与算法——二叉排序树详解以及代码实现
  8. DMX512协议个人总结,待验证,欢迎拍砖
  9. CodeSmith 7.01破解
  10. linux文件管理ppt,Linux操作系统_文件管理2.ppt
  11. MySQL之SQL语句实现将三个查询结果集拼接成一个表
  12. 荣耀20android版本,荣耀法国:荣耀V20/20系列可正常升级Android Q
  13. linux的qt下wsadata,Qtcpserver仅在调试器下返回listen函数的未知错误
  14. 什么是 DNS 故障?常见原因和解决方案
  15. SA与OOA的区别,个人理解
  16. Unity3D 建筑类 虚拟漫游 PC 端 优化
  17. 逻辑电路复杂?我们用Logisim一键解决
  18. 十进制逢十进一的意思
  19. 极大似然原理和贝叶斯分类器
  20. 30条实用信息教你读懂电影版本

热门文章

  1. python二分法查找程序_Python程序查找最大EVEN数
  2. Python operator.lt()函数与示例
  3. 软件可用性测试mantis,学生选课系统-软件可用性测试实验.doc
  4. velocity自定义函数_velocity基本语法和总结
  5. oracle 增量_【干货分享】DMETL中的增量抽取初识
  6. git rebase用法_Git入门实战
  7. python预定义_【Python】python类中方法的预定义
  8. ruby array_Ruby中带有示例的Array.delete_if方法
  9. 一口气说出 6 种延时队列的实现方法,面试官满意的笑了
  10. js 自己试验 创建对象例子