MybatisSQL语句的where和where区别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MybatisSQL语句的where和where区别
⼀、where⼦句:
在平时写SQL语句的时候,经常会写为:
<select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="ng.Integer">
select count(id) from t_book t where1=1
<if test="title !=null and title !='' ">
AND title = #{title}
</if>
<if test="author !=null and author !='' ">
AND author = #{author}
</if>
</select>
可以看到,SQL语句中,有 where 1=1 的情况,这是为了防⽌后⾯的 <if>语句都为空的情况。

注:where 1=1 ,后⾯的条件也会⾛索引,不影响查询效率,我们写的sql指令会被mysql 进⾏解析优化成⾃⼰的处理指令,在这个过程中1 = 1这类⽆意义的条件将会被优化。

使⽤explain EXTENDED sql 进⾏校对,发现确实where1=1这类条件会被mysql的优化器所优化掉。

但是,我们在mybatis当中可以改变⼀下写法,因为毕竟mysql优化器也是需要时间的,虽然是⾛了索引,但是当数据量很⼤时,还是会有影响的,所以我们建议代码修改如下:
⼆、<where>标签:
<select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="ng.Integer">
select count(*) from t_book t
<where>
<if test="title !=null and title !='' ">
title = #{title}
</if>
<if test="author !=null and author !='' ">
AND author = #{author}
</if>
</where>
</select>
使⽤<where>标签代替 where⼦句,<where>标签为Mybatis的动态语句,上述代码中若where标签⾥的if全都不成⽴,则不⾛where语句。

若第⼀个 title值为null,则打印出来的 SQL语句为:select count(*) from t_book t where author = "xx",会把第⼀个AND/OR⾃动忽略掉。

若直接⽤where⼦句的话可能会导致sql语法错误,查询失败。

相关文档
最新文档