mybatis <where> <choose>标签
当遇到多个查询条件,使用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>标签相关推荐
- Mybatis的choose标签
1.choose标签介绍 choose标签作用条件判断来拼接指定的条件,它和if不太相同,choose似类于java中的switch语句用法,直要有条件成立,其它判断将得不到执行,如果所有条件都不成立 ...
- mybatis choose标签的使用
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个.而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件.MyBatis 提供了 choose 元素.if标签是 ...
- mybatis choose标签的用法
先上代码: <choose> <when test="BEGINTIME != null and BEGINTIME != '' and ENDTIME != null a ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...
- mybatis 支持的标签操作
62.mybatis支持的标签操作 mybatis只支持include|trim|where|set|foreach|choose|if这几个操作
- MyBatis中常见标签的使用
1. <collection>标签 例如有两张表:user表 role表 那么我们再写实体类User .Role 的对应关系是,一个用户有多个角色,因此,在 User 的实体中加入一个 R ...
- MySQL中choose标签的用法
MySQL中标签的用法 先给大家来个SQL语句: choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似. SELECT ...
- Mybatis的where标签,还有这么多知识点
背景 在上篇文章,我们系统地学习了where 1=1 相关的知识点,大家可以回看<不要再用where 1=1了!有更好的写法!>这篇文章.文章中涉及到了Mybatis的替代方案,有好学的朋 ...
- MyBatis 配置 settings 标签
MyBatis 配置 settings 标签 1. 简介 2. Setting的详细配置信息 3.示例配置 1. 简介 MyBatis 的 是一个极其重要的标签调整,我们可以通过这个标签修改 MyBa ...
- Mybatis - xml文件标签中写注释
Mybatis - xml文件标签中写注释 1.错误场景. ( /* */ 注释 ) 在IDEA中的直接使用快捷键注释 Ctrl + Shift + / 注释. SELECT t.name, t.ag ...
最新文章
- Error in xy.coords(x, y, xlabel, ylabel, log) : ‘x‘ and ‘y‘ lengths differ
- 固态器件理论(11)超导设备
- 死磕Java并发:J.U.C之Java并发容器:ConcurrentLinkedQueue
- Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析
- 千万级、百万级数据删除优化
- Java常用设计模式————原型模式(二)之深拷贝与浅拷贝
- 小甲鱼java视频_b站有哪些好的java视频?
- 一文搞懂常见概率分布的直觉与联系
- RobotFramework特性总结
- PLC(二)西门子S7-200PLC基础知识
- 新政举市暖冬再现? 业内乐观情绪高涨
- 用Python写个「倒计时」软件
- java中怎么使用json数据_java中使用Json数据
- python socket通信 心跳_python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)-阿里云开发者社区...
- 58同城字体加密解密方法
- 表格无法无法计算机,电脑表格打不开是怎么回事
- 2023AP微积分AB考试报名开启
- JVM(Java虚拟机模型、Java运行时数据区模型)
- 曲面触摸传感器设计的挑战
- How to Have a Healthy Relationship --shanbei 为单身节写