我就废话不多说了,大家还是直接看代码吧~
<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。