巧妙mybatis避免Where 空条件的尴尬

 更新时间:2020年11月27日 14:51:43   作者:susu11581147324  
这篇文章主要介绍了巧妙mybatis避免Where 空条件的尴尬,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

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

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

SELECT * FROM BLOG

WHERE

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

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

但是这个做法不太“环保”(毕竟引入了一个垃圾条件),其实只要改成<where>...</where>即可

<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<Dept> 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 空条件的尴尬就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SparkSQL快速入门教程

    SparkSQL快速入门教程

    Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块,今天通过本文给大家介绍SparkSQL快速入门教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-02-02
  • springboot文件上传保存路径的问题

    springboot文件上传保存路径的问题

    这篇文章主要介绍了springboot文件上传保存路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • MyBatis 源码分析 之SqlSession接口和Executor类

    MyBatis 源码分析 之SqlSession接口和Executor类

    mybatis框架在操作数据的时候,离不开SqlSession接口实例类的作用,下面通过本文给大家实例剖析MyBatis 源码分析之SqlSession接口和Executor类,需要的朋友参考下吧
    2017-02-02
  • Jenkins节点配置实现原理及过程解析

    Jenkins节点配置实现原理及过程解析

    这篇文章主要介绍了Jenkins节点配置实现原理及过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java多线程编程之Lock用法实例

    Java多线程编程之Lock用法实例

    这篇文章主要介绍了Java多线程编程之Lock用法实例,本文直接给出代码实例,需要的朋友可以参考下
    2015-05-05
  • Java如何调用C++ DLL库

    Java如何调用C++ DLL库

    本文重点给大家介绍java中调用c++ dll库的方法,本文分步骤介绍的非常详细,感兴趣的朋友可以参考下
    2016-06-06
  • 使用socket进行服务端与客户端传文件的方法

    使用socket进行服务端与客户端传文件的方法

    这篇文章主要介绍了使用socket进行服务端与客户端传文件的方法,需要的朋友可以参考下
    2017-08-08
  • SpringMVC HttpMessageConverter报文信息转换器

    SpringMVC HttpMessageConverter报文信息转换器

    ​​HttpMessageConverter​​​,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文。​​​HttpMessageConverter​​​提供了两个注解和两个类型:​​@RequestBody,@ResponseBody​​​,​​RequestEntity,ResponseEntity​​
    2023-01-01
  • java Object wait方法详细介绍

    java Object wait方法详细介绍

    这篇文章主要介绍了java Object wait方法详细介绍的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java 逻辑控制全面详解

    Java 逻辑控制全面详解

    程序的逻辑主要分为三种结构:顺序结构、分支结构、循环结构,顺序结构的所有的代码都是从前向后执行的。有些时候顺序是由“{}”为界限的,下文将全面详细的介绍
    2021-10-10

最新评论