巧妙mybatis避免Where 空条件的尴尬
我就废话不多说了,大家还是直接看代码吧~
SELECT*FROMBLOG WHERE state=#{state}
如果state参数为空时,最终生成SQL语句为
SELECT*FROMBLOG
WHERE
执行会出错,当然,你可以在where后加一个1=1,改成
SELECT*FROMBLOG WHERE1=1 andstate=#{state}
但是这个做法不太“环保”(毕竟引入了一个垃圾条件),其实只要改成
SELECT*FROMBLOG andstate=#{state}
补充知识:mybatis@Select注解中当参数为空则不添加该参数的判断
如下所示:
@Select("select*from"+DEPTTABLE+"")
List
selectAllDept();
在mybatis中不用xml文件的形式,selectDept方法执行的就是上面的Sql语句,如果是遇到动态的语句就需要用到下面的形式。
1.用Provider去实现SQL拼接:
@SelectProvider(type=DeptDynaSqlProvider.class,method="count") Integercount(Mapparams); //DeptDynaSqlProvider.class类中的方法 publicStringcount(Map params){ returnnewSQL(){{SELECT("count(*)");FROM(DEPTTABLE);if(params.get("dept")!=null){Deptdept=(Dept)params.get("dept");if(dept.getName()!=null&&!dept.getName().equals("")){WHERE("nameLIKECONCAT('%',#{dept.name},'%')");}}}}.toString();}
2.还有一种方式是用script标签包围,像xml语法一样书写
@Select({""})
注意:方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。
复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似SpringJDBCTemplate。
以上这篇巧妙mybatis避免Where空条件的尴尬就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。