MyBatis教程大全


 MyBatis SQL 映射

     MyBatis select 标签

     MyBatis 多数据库支持

     MyBatis selectKey 标签作用

     MyBatis @SelectKey注解用法介绍

     MyBatis @SelectKey注解用法详细介绍

     MyBatis keyProperty 属性介绍

     MyBatis insert、update 和 delete 元素

     MyBatis sql 元素

 MyBatis SQL 参数映射

     MyBatis SQL 参数映射

 MyBatis 动态SQL

     MyBatis 动态SQL与数据准备

     MyBatis if 标签

     MyBatis if else 用法

     MyBatis choose、when、otherwise 标签

     MyBatis where 标签

     MyBatis set 标签

     MyBatis foreach 标签

     MyBatis bind 标签

     MyBatis trim 标签

 MyBatis SQL 结果映射

 MyBatis SQL 结果之关系映射

 MyBatis 使用介绍

     MyBatis typeAliases 类型别名

     MyBatis typeHandlers 类型处理器

     MyBatis Transaction 事务接口

     MyBatis transactionManager 事务管理

     SqlSessionFactory 介绍

     MyBatis 核心对象 SqlSession

     MyBatis 初始化 创建 Session 实例

     MyBatis ObjectFactory 对象工厂

     MyBatis缓存机制:一级缓存和二级缓存

     MyBatis 常用注解

 MyBatis 配置文件

     MyBatis 配置文件

 MyBatis 映射

     MyBatis 映射简介

     MyBatis ResultMap 映射

     MyBatis 自动映射

     MyBatis 高级映射

     MyBatis 集合映射

     MyBatis 关联映射

     MyBatis 一对一关联映射

     MyBatis 一对多关联映射

     MyBatis 多对多关联映射

     MyBatis 一对一(注解形式)

     MyBatis 一对多(注解形式)

     MyBatis 多对多(注解形式)

     MyBatis resultMap 元素

 MyBatis 面试题库

     #{}和${}的区别是什么?

     数据库链接中断如何处理?

     数据库插入重复如何处理?

     事务执行过程中宕机的应对处理方式

     Java客户端中的一个Connection问题

MyBatis trim 标签

备注:本文修订于2022年6月29日。

1、MyBatis trim 标签

Mybatis具有实现动态SQL的能力,但是在拼凑SQL语句的时候,稍有不注意则会画蛇添足,此时可以通过 trim 标签来进行修剪。trim 是“修剪”的意思,其基本格式如下:

<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>

trim 标签的主要属性有四个,如下表所示:

属性名 作用
prefix 给sql增加前缀
suffix 给sql增加后缀
prefixOverrides 去掉sql前面多余的关键字或者字符
suffixOverrides 去掉sql后面多余的关键字或者字符

2、prefix 使用场景介绍

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

在动态生成SQL的过程中,会将prefix前缀拼接到trim标签的外侧,最终得到的SQL如下:

select * from t_users where name= ? and age= ? and phone = ?

3、prefixOverrides 使用场景介绍

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

在动态 SQL 的拼接过程中,如果 name 为 null,则第一个 if 不成立,里面的 SQL 语句不拼接,第二个 if 里面的 and 会紧跟在 where 后面,造成语法错误,最终动态生成的 SQL 如下:

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

为了解决这个问题,只要加上 prefixOverrides 即可:

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

当然,prefix 和 prefixOverrides 可以放在一起综合使用,如下所示:

select * from t_users 
<trim prefix="WHERE" prefixOverrides="AND|OR">
  <if test="name != null and name.length() > 0"> AND name=#{name}</if>
  <if test="gender != null and gender.length() > 0"> AND gender=#{gender}</if>
</trim>

假如name和gender的值都不为null,打印出的SQL是这样的:

select * from t_users where  name = ? and gender = ?

where后不存在and,这是因为prefixOverrides="AND|OR"代表去掉第一个and或者是or。

4、suffix 和 suffixOverrides 使用场景介绍

update t_users 
<trim prefix="set" suffixOverrides="," suffix=" where id = #{id} ">
  <if test="name != null and name.length() > 0"> name=#{name}, </if>
  <if test="gender != null and gender.length() > 0"> gender=#{gender},  </if>
</trim>

假如name和gender的值都不为null,打印出的SQL为:

update t_users set name = ? , gender = ?  where id = ?

trim 标签的作用是:在 gender = ? 后面裁剪了逗号,而且自动加了一个 set 前缀和 where 后缀。

5、提醒

prefix 是给整个字符串增加一个前缀,而 prefixOverrides 则是去掉整个字符串前面多余的字符。
suffix 是给整个字符串增加一个后缀,而 suffixOverrides 则是去掉整个字符串后面多余的字符。

其实,上述的处理过程与 set 标签类似,针对的都是整个字符串后面的多余字符。