巧妙mybatis避免Where 空条件的尴尬
我就废话不多说了,大家还是直接看代码吧~
<select resultType='Blog'> SELECT * FROM BLOG WHERE <if test='state != null'> state = #{state} </if> </select>
如果state参数为空时,最终生成SQL语句为
SELECT * FROM BLOG
WHERE
执行会出错,当然,你可以在where 后加一个1=1,改成
<select resultType='Blog'> SELECT * FROM BLOG WHERE 1=1 <if test='state != null'> and state = #{state} </if> </select>
但是这个做法不太“环保”(毕竟引入了一个垃圾条件),其实只要改成<where>...</where>即可
<select 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 空条件的尴尬就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持好吧啦网。
相关文章: