mybatis 用<where>标签解决动态sql的尴尬问题19-8-13傍晚

之前写sql有遇到过这样的:

SELECT A.ID, A.ATTENTION_ID, A.ATTENTION_EMPEE, A.DEAL_TIME, A.ACTUAL_RESULT, A.EXPERT_ADVICE, A.DEAL_STATE
FROM DSF_ACCT_ATTENTION_HANDLE_LIST A
WHERE 
<if test="ATTENTION_ID != null and ATTENTION_ID != ''">
	A.ATTENTION_ID = #{ATTENTION_ID}
</if>
<if test="EMPEE_ACCT != null and EMPEE_ACCT != ''">
  AND A.ATTENTION_EMPEE = #{EMPEE_ACCT}
</if>
<if test="DEAL_STATE != null and DEAL_STATE !='' or DEAL_STATE == '0'">
  AND A.DEAL_STATE = #{DEAL_STATE}
</if>  

乍一看好像没什么问题,可以仔细一思考当ATTENTION_ID为null的时候,下面两个if中的EMPEE_ACCT ,EMPEE_ACCT 有不为空的时候 整个sql就会被解析变成:
若EMPEE_ACCT不为null,DEAL_STATE 为null,

SELECT A.ID, A.ATTENTION_ID, A.ATTENTION_EMPEE, A.DEAL_TIME, A.ACTUAL_RESULT, A.EXPERT_ADVICE, A.DEAL_STATE
FROM DSF_ACCT_ATTENTION_HANDLE_LIST A
WHERE 
  AND A.ATTENTION_EMPEE = #{EMPEE_ACCT}

很明显这时就会报SQL异常
再就是若全为null,就会被解析成这样

SELECT A.ID, A.ATTENTION_ID, A.ATTENTION_EMPEE, A.DEAL_TIME, A.ACTUAL_RESULT, A.EXPERT_ADVICE, A.DEAL_STATE
FROM DSF_ACCT_ATTENTION_HANDLE_LIST A
WHERE 

很明显也会报SQL异常。

这里就有两种解决方案,同样不用标签,

1、在<if>前面<where>后面加个1=1就可以了

SELECT A.ID, A.ATTENTION_ID, A.ATTENTION_EMPEE, A.DEAL_TIME, A.ACTUAL_RESULT, A.EXPERT_ADVICE, A.DEAL_STATE
FROM DSF_ACCT_ATTENTION_HANDLE_LIST A
WHERE 1=1
<if test="ATTENTION_ID != null and ATTENTION_ID != ''">
	AND A.ATTENTION_ID = #{ATTENTION_ID}
</if>
<if test="EMPEE_ACCT != null and EMPEE_ACCT != ''">
  AND A.ATTENTION_EMPEE = #{EMPEE_ACCT}
</if>
<if test="DEAL_STATE != null and DEAL_STATE !='' or DEAL_STATE == '0'">
  AND A.DEAL_STATE = #{DEAL_STATE}
</if>  

这样就完美的解决问题了
2、使用<where> </where>标签

SELECT A.ID, A.ATTENTION_ID, A.ATTENTION_EMPEE, A.DEAL_TIME, A.ACTUAL_RESULT, A.EXPERT_ADVICE, A.DEAL_STATE
FROM DSF_ACCT_ATTENTION_HANDLE_LIST A
<where>
<if test="ATTENTION_ID != null and ATTENTION_ID != ''">
	AND A.ATTENTION_ID = #{ATTENTION_ID}
</if>
<if test="EMPEE_ACCT != null and EMPEE_ACCT != ''">
  AND A.ATTENTION_EMPEE = #{EMPEE_ACCT}
</if>
<if test="DEAL_STATE != null and DEAL_STATE !='' or DEAL_STATE == '0'">
  AND A.DEAL_STATE = #{DEAL_STATE}
</if>  
</where>

这样就能解决问题了,<where>会根据里面if所判断的字段是否全为null 或是 有不为空的项,来判断是否有where 语句,若是全为null,则SQL语句后面就没有 where:

SELECT A.ID, A.ATTENTION_ID, A.ATTENTION_EMPEE, A.DEAL_TIME, A.ACTUAL_RESULT, A.EXPERT_ADVICE, A.DEAL_STATE
FROM DSF_ACCT_ATTENTION_HANDLE_LIST A

并且还能自动的处理 if标签里,语句的and,若是是最接近where 的if 会自动地去除掉此if标签中的and

注:在其他地方都会有看到 运用**<where></where>90%都能解决问题**,但是是不一定哦!(●’◡’●)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值