当前位置: 首页 > 编程笔记 >

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

夹谷沛
2023-03-14
本文向大家介绍巧妙mybatis避免Where 空条件的尴尬,包括了巧妙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 空条件的尴尬就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 我想知道是否有可能在Java中“避免”空检查,以下面的代码为例: 它必须检查4次,否则代码将失败。 是否可以将语句转换为只有在没有NullPointerException时才执行的一行式语句?当出现异常时,该行应该被忽略。 这里我不是在谈论一个通用的语言特性,我是在谈论一个只有当您明确决定这样做时才会上交的特性。 例如:将是建议代码的一个片段。 在Java可能发生这样的事情吗? 如果不可能的话,在

  • 我有一个分布式任务队列,其中的任务如下所示: 这里有一个竞争条件:如果任务队列软件在完全相同的时间启动其中两个任务,它们都将从数据库中获得相同的<code>old_path</code>,并且竞争失败者的取消链接调用失败(将失败者的新路径从未来的取消链接中孤立出来)。 有没有办法让我构建它来绕过这场比赛?如果需要,我可以从当前设计中抛出几乎任何东西。具体来说,我使用的是PostgreSQL,Pyt

  • 将编译为以下内容而不使用装箱: 因此,编译器确实特别对待,但不是在泛型类上下文中。

  • 问题内容: 我正在开发的应用程序中存在潜在的竞争状况,我想在查询中考虑和避免这种情况。 总结应用程序流程… 在表中创建一个新行: 通过查看对时间敏感的表格,找出Bar先生是否是获胜者: 如果他是赢家,请相应地更新他的条目行: 由于每个奖项只能颁发一次,因此我需要消除比赛条件的任何可能性,在这种情况下,另一个过程可以查询奖项表并更新上述步骤2和3之间的条目表。 我一直在做一些研究,发现了大量关于事务

  • 在我的程序中,我需要检查变量是否等于1、2或3,并根据结果执行不同的方法: 这段代码非常简单和基本,但我真的不喜欢它。当然,我可以使用开关条件,但以我的拙见,它只会以不同的方式显示相同的基本功能。 我的问题是:有没有一种优雅的、可扩展的方式来实现功能? 仅供参考,我已经红了这篇文章,但我没有找到适合我问题的答案。

  • 问题内容: 当不可能使用空对象时,最好的方法是替换条件运算符空检查样板,如下所示: Java 8或任何实用程序库中是否有类似下面的内容? 问题答案: 我发现它是最易读的,因此也许它是更好的解决方案,而不仅仅是使您的代码过于复杂。它可以完成工作,并且没有任何问题- 因此不妨使用它。这就是条件运算符的作用。 通常,在尝试决定使用哪种编程模式时,最好使用最易读,最容易让代码的未来维护者理解的模式。

  • 我读过很多关于代码重构和避免if-else语句的主题。实际上,我有一个类,我使用了很多if-else条件。 更多细节:我正在使用pull解析器,在soap响应的每一行,我会检查是否有我感兴趣的标签,如果没有,请检查另一个标签等: 现在,我想用别的东西,而不是那些if else条件,但我不知道是什么。 你能给我举个例子吗?

  • 但是,如果camp.start_date为NULL或没有行,那么它将引发异常- ORA-01858:在需要数字的地方发现了一个非数字字符 camp.start_date实际上是一个VARCHAR2,我需要将它转换为日期(是的,我知道它可能应该是一个日期字段,但我没有更改它的选项)。 其中camp.start_date不为null并且to_date(camp.start_date,'mm/dd/yy