Mybatis值trim标签

本文详细解析MyBatis中trim标签的使用,包括prefix、suffix、prefixOverrides和suffixOverrides属性,通过实例展示如何构建动态SQL,解决常见语法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Mybatis具有实现动态SQL的能力,使用这个特性免不了会用到trim这个标签,trim标签的功能简单来说就是自定义格式拼凑SQL语句。
        trim有4个属性:

prefix:表示在trim包裹的SQL前添加指定内容
suffix:表示在trim包裹的SQL末尾添加指定内容
prefixOverrides:表示去掉(覆盖)trim包裹的SQL的指定首部内容
suffixOverrides:表示去掉(覆盖)trim包裹的SQL的指定尾部内容

来看例子:
查找某个用户,通过名字和年龄

public User getUser(@Param("LastName") String lastName,@Param("age") Integer age,@Param("phone") String phone);

对应xml,先看首先想到的:

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

执行时输出的SQL语句
在这里插入图片描述

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

输出同样SQL,这个就是prefix的效果
在这里插入图片描述

  1. prefixOverrides
    当然实际使用时查找条件都需要做一些判断,最基本的是否为null。
<select id="getUser" resultType="user">
	select * from user_tab 
	<trim prefix="where">
		<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>

执行语句与上面一样,但是假如现在lastName参数为null,我们再看:

// 查询
User user = userMapper.getUser(null, 12,"120");

在这里插入图片描述
因为lastName为null,所以第一个if不成立里面的SQL语句不拼接,第二个if里面的and边紧跟在where后面了,语法错误,这是只要加上prefixOverride即可,把首个“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>

在这里插入图片描述
如果是先要去掉and获取or,则必须这样写prefixOverrides=“and |or”,注意中间的空格。

  1. suffix、suffixOverrides
    上面查找,这里来看更新
// 根据id来更新
public void updateUser(@Param("user") User user);

对应的xml

<!--普通版-->
<update id="updateUser">
	update user_tab
	set last_name=#{lastName},age=#{age},phone=#{phone}
	where id=#{id}
</update>

使用suffix,并加上条件判断

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

执行输出跟上面的普通版语句一样没问题,可以看到suffix的效果
在这里插入图片描述
同样的假如phone为null了,

// 更新
userMapper.updateUser(new User(2, "jack", 20, null));

在这里插入图片描述
因为最会一个if条件不成立,所以倒数第二个if里面的逗号在where的左侧语法错误,此时使用suffixOverrides即可

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

再次执行输出,成功执行,这个就是suffixOverrides的作用
在这里插入图片描述

好了,这个就是trim标签即属性的基本介绍,具体怎么使用看实际情况,上面只是作为演示。

<think>嗯,用户想了解MyBatis中的<trim>标签的用法和示例。我需要先回忆一下相关的知识,然后结合提供的引用内容来组织回答。 首先,根据引用[1],trim标签主要用于动态构建SQL,去除多余的关键字和符号,添加前后缀。属性包括prefix、suffix、prefixOverrides、suffixOverrides。这点很重要,需要详细说明每个属性的作用。 然后,引用[3]和[4]提供了具体的示例,比如在UPDATE语句中去除多余的逗号,或者在WHERE子句中去掉前面的AND。这些例子可以帮助用户更好地理解如何应用trim标签。 接下来,我需要考虑用户可能的实际使用场景。比如动态查询条件、选择性更新或插入,这些都是trim标签的常见用途。需要分场景给出示例代码,并解释每个部分的作用。 还要注意用户可能遇到的问题,比如特殊字符转义。引用[2]提到MyBatis会转义特殊字符,但在写示例时可能不需要特别处理,但如果有特殊符号需要注意。 需要确保回答结构清晰,分点说明,每个部分有代码示例和解释。同时,根据用户的要求,生成相关问题,比如与其他标签的对比,或者常见错误,这些能帮助用户深入理解。 最后,检查示例中的SQL语法是否正确,trim标签的属性是否正确使用,比如prefixOverrides是否用管道符分隔多个字符串,suffix的处理是否合适。确保引用正确,每个示例后标注对应的引用来源。</think>### MyBatis `<trim>` 标签使用详解 #### 1. `<trim>` 标签的核心作用 `<trim>` 标签主要用于动态 SQL 语句的片段修饰,可实现以下功能: - **去除多余符号**:自动移除 SQL 片段开头或结尾的指定字符(如 `AND`、`OR`、`,` 等) - **添加前后缀**:动态添加 `WHERE`、`SET`、`VALUES` 等 SQL 关键词 - **灵活组合语句**:根据条件拼接不同 SQL 片段,提高可维护性[^1] #### 2. 核心属性说明 | 属性名 | 功能描述 | |-------------------|-------------------------------------------------------------------------| | `prefix` | 在修饰后的内容前**添加指定前缀**(如 `WHERE`、`SET`) | | `suffix` | 在修饰后的内容后**添加指定后缀**(如 `)`) | | `prefixOverrides` | 通过管道符 `\|` 分隔需要**去除的前缀字符**(如 `AND \| OR`) | | `suffixOverrides` | 通过管道符 `\|` 分隔需要**去除的后缀字符**(如 `,`) | #### 3. 典型使用场景及示例 ##### 场景 1:动态 WHERE 条件 ```xml <select id="selectUser" resultType="User"> SELECT * FROM users <trim prefix="WHERE" prefixOverrides="AND | OR"> <if test="name != null">AND name = #{name}</if> <if test="age != null">OR age = #{age}</if> </trim> </select> ``` **执行效果**: 当 `name` 和 `age` 都存在时,自动去除首个 `AND`/`OR`,生成 `WHERE name=? AND age=?` 当仅 `age` 存在时,去除 `OR` 生成 `WHERE age=?`[^4] ##### 场景 2:动态 UPDATE 语句 ```xml <update id="updateUser"> UPDATE users <trim prefix="SET" suffixOverrides=","> <if test="name != null">name = #{name},</if> <if test="email != null">email = #{email},</if> </trim> WHERE id = #{id} </update> ``` **执行效果**: 自动去除最后一个字段后的逗号,保证 `SET name=?, email=?` 语法正确[^3] ##### 场景 3:动态 INSERT 语句 ```xml <insert id="insertUser"> INSERT INTO users <trim prefix="(" suffix=")" suffixOverrides=","> <if test="name != null">name,</if> <if test="age != null">age,</if> </trim> VALUES <trim prefix="(" suffix=")" suffixOverrides=","> <if test="name != null">#{name},</if> <if test="age != null">#{age},</if> </trim> </insert> ``` **执行效果**: 动态构建字段列表和列表,自动去除多余逗号,生成 `(name,age) VALUES (?,?)` #### 4. 特殊字符处理注意 当 SQL 语句包含 `&`、`<`、`>` 等特殊字符时,MyBatis 会自动进行 XML 转义(如 `&` → `&`)[^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值