当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 1=1 ”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描) 来比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL 注入的风险。

where标签方式

<select id="findActiveBlogLike" resultType="Blog">SELECT * FROM BLOG<where>is_delete=0<if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where>
</select>

choose (when, otherwise)标签

有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

<choose><when test="isUpdate !=null ">AND u.is_update = #{isUpdate, jdbcType=INTEGER}</when><when test="isDelete != null">AND u.is_delete = #{isDelete, jdbcType=INTEGER}</when><otherwise></otherwise>
</choose>

foreach标签

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:

<select id="selectPostIn" resultType="domain.blog.Post">SELECT *FROM POST PWHERE ID IN<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach>
</select>

include标签

<mapper namespace="com.test.BaseDAO"><sql id="where">STATUS IN (1,2,3,4)</sql>
</mapper><select id="findAll" resultMap="BaseResultMap">
SELECT * FROM TEST WHERE <include refid="com.test.BaseDAO.where"/>
</select>

trim标签

select * from user_tab where last_name=#{lastName} and age=#{age} and phone=#{phone}

使用示例

<select id="getUser" resultType="user">select * from user_tab <trim prefix="where">last_name=#{lastName} and age=#{age} and phone=#{phone}</trim>
</select>

prefixOverrides 使用

select * from user_tab where and age = ? and phone = ?

在动态sql的查询过程中,如果 lastName为null,所以第一个if不成立,里面的SQL语句不拼接,第二个if里面的and边紧跟在where后面了,语法错误。为了解决这个问题,只要加上prefixOverride即可,表示把动态生成的sql中,trim标签内的首个“and”去掉。

<select id="getUser" resultType="user">select * from user_tab <trim prefix="where" prefixOverrides="and"><if test="lastName != null">last_name=#{lastName}</if><if test="age != null">and age=#{age}</if><if test="phone != null">and phone=#{phone}</if></trim>
</select>

suffixOverrides的使用

update user_tab set ast_name=?,  age=?,

若phone的值为null,则会导致生成的sql语句最后一个符号为“,”,导致生成的sql出错。 为了避免此种情况,可使用trim标签中的suffixOverrides 将最后面的一个符号覆盖掉。

<update id="updateUser"><trim suffix="where id=#{id}" suffixOverrides=",">update user_tabset<if test="lastName != null">last_name=#{lastName},</if><if test="age != null">age=#{age},</if><if test="phone != null">phone=#{phone}</if> </trim>
</update>

resultType

resultType="java.lang.Integer"

<select id = "selectMaxAgeBySex" resultType="java.lang.Integer">select max(age) from user where sex = '女'
</select>

mybatis <where> <choose>标签相关推荐

  1. Mybatis的choose标签

    1.choose标签介绍 choose标签作用条件判断来拼接指定的条件,它和if不太相同,choose似类于java中的switch语句用法,直要有条件成立,其它判断将得不到执行,如果所有条件都不成立 ...

  2. mybatis choose标签的使用

    有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个.而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件.MyBatis 提供了 choose 元素.if标签是 ...

  3. mybatis choose标签的用法

    先上代码: <choose> <when test="BEGINTIME != null and BEGINTIME != '' and ENDTIME != null a ...

  4. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  5. mybatis 支持的标签操作

    62.mybatis支持的标签操作 mybatis只支持include|trim|where|set|foreach|choose|if这几个操作

  6. MyBatis中常见标签的使用

    1. <collection>标签 例如有两张表:user表 role表 那么我们再写实体类User .Role 的对应关系是,一个用户有多个角色,因此,在 User 的实体中加入一个 R ...

  7. MySQL中choose标签的用法

    MySQL中标签的用法 先给大家来个SQL语句: choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似. SELECT ...

  8. Mybatis的where标签,还有这么多知识点

    背景 在上篇文章,我们系统地学习了where 1=1 相关的知识点,大家可以回看<不要再用where 1=1了!有更好的写法!>这篇文章.文章中涉及到了Mybatis的替代方案,有好学的朋 ...

  9. MyBatis 配置 settings 标签

    MyBatis 配置 settings 标签 1. 简介 2. Setting的详细配置信息 3.示例配置 1. 简介 MyBatis 的 是一个极其重要的标签调整,我们可以通过这个标签修改 MyBa ...

  10. Mybatis - xml文件标签中写注释

    Mybatis - xml文件标签中写注释 1.错误场景. ( /* */ 注释 ) 在IDEA中的直接使用快捷键注释 Ctrl + Shift + / 注释. SELECT t.name, t.ag ...

最新文章

  1. Error in xy.coords(x, y, xlabel, ylabel, log) : ‘x‘ and ‘y‘ lengths differ
  2. 固态器件理论(11)超导设备
  3. 死磕Java并发:J.U.C之Java并发容器:ConcurrentLinkedQueue
  4. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析
  5. 千万级、百万级数据删除优化
  6. Java常用设计模式————原型模式(二)之深拷贝与浅拷贝
  7. 小甲鱼java视频_b站有哪些好的java视频?
  8. 一文搞懂常见概率分布的直觉与联系
  9. RobotFramework特性总结
  10. PLC(二)西门子S7-200PLC基础知识
  11. 新政举市暖冬再现? 业内乐观情绪高涨
  12. 用Python写个「倒计时」软件
  13. java中怎么使用json数据_java中使用Json数据
  14. python socket通信 心跳_python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)-阿里云开发者社区...
  15. 58同城字体加密解密方法
  16. 表格无法无法计算机,电脑表格打不开是怎么回事
  17. 2023AP微积分AB考试报名开启
  18. JVM(Java虚拟机模型、Java运行时数据区模型)
  19. 曲面触摸传感器设计的挑战
  20. How to Have a Healthy Relationship --shanbei 为单身节写

热门文章

  1. IP Routing 概述
  2. DINO:一种新的端到端目标检测器(速读版)
  3. 枕头的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. MySQL用户管理语句001
  5. 根据VendorId 和DeviceId 查看PCI设备的名称
  6. 一年级有计算机教学吗,一年级信息技术教学计划范文
  7. 计算机屏幕黑屏让程序继续允许,电脑软件让对方黑屏
  8. Win11删除英文输入法的方法教程
  9. hdu5385 wyh2000 and pupil 二分图
  10. iOS安装脱壳后的ipa