mybatis 用标签解决动态sql的尴尬问题19-8-13傍晚
2019-08-13 19:08
405 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42307562/article/details/99461493
之前写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 AWHERE<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 AWHEREAND 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 AWHERE
很明显也会报SQL异常。
这里就有两种解决方案,同样不用标签,
1、在前面后面加个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 AWHERE 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、使用 标签
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>
这样就能解决问题了,会根据里面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
注:在其他地方都会有看到 运用**90%都能解决问题**,但是是不一定哦!(●’◡’●)
相关文章推荐
- MyBatis解决Update动态SQL逗号的问题
- MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)
- mybatis动态sql解决关于There is no getter for property named 'certitype'错误问题
- Mybatis 动态sql if标签 传参的问题
- 解决动态生成的SQL中特殊字符的问题 QuotedStr function
- 解决从pl/sql查看oracle的number(19)类型数据为科学计数法的问题
- Mybatis、ibatis动态SQL问题
- MyBatis中SQL语句在Log4j下不显示的问题解决
- MyBatis动态SQL标签
- MyBatis动态SQL之一使用 if 标签和 choose标签
- Extjs form表单 动态设置标签的隐藏和显示 (解决问题)
- MyBatis动态sql问题
- 解决mybatis动态传入order by 参数的时候不生效的问题
- mybatis动态sql中的trim标签的使用
- 关于mybatis的动态if语句查询报错问题和解决方法
- MyBatis动态SQL中trim标签的使用
- MyBatis动态SQL中的trim标签的使用方法
- 动态script标签解决跨域问题实例
- jquery html动态生成select标签出问题的解决方法
- MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题 X