标签
标签通常用于在动态 SQL 中根据条件来动态拼接 SQL 语句。这个标签可以根据传入的参数值判断条件是否成立,从而决定是否包含特定的 SQL 片段。
test
属性是必需的,它包含一个 OGNL(Object Graph Navigation Language)表达式,MyBatis 会对这个表达式进行求值。如果表达式的值为true
,就会将
标签内的 SQL 片段拼接到最终的 SQL 语句中;若为 false
,则会忽略该 SQL 片段。
使用示例:
<select id="selectUsers" resultType="com.example.User">
SELECT * FROM users
WHERE 1 = 1
<if test="name != null and name != ''">
AND name = #{name}
if>
<if test="age != null">
AND age = #{age}
if>
select>
标签
标签通常与其他条件判断标签(如
、
、
和
)结合使用,用于动态拼接查询条件。
标签的主要作用是简化动态 SQL 中 WHERE 子句的编写,它能智能地处理 WHERE 子句中 AND
、OR
关键字的拼接问题,也能自动将内部的条件片段用 AND
或 OR
连接。当
标签内的条件都不满足时,它会自动去掉 WHERE 关键字;当条件满足时,它会自动去掉第一个条件前多余的 AND
或 OR
关键字,避免出现 SQL 语法错误。
使用示例:
<select id="selectUsers" resultType="com.example.entity.User">
SELECT * FROM users
<where>
<if test="name != null and name != ''">
name = #{name}
if>
<if test="age != null">
AND age = #{age}
if>
where>
select>
标签
标签可以在生成 SQL 语句时对文本进行修剪(trim)、添加前缀(prefix)、后缀(suffix)以及指定连接符。这使得在拼接 SQL 语句时可以更加灵活地控制生成的文本,往往与其他条件判断标签(如
、
、
等)结合使用。
标签属性 |
说明 |
---|---|
prefix |
在 标签内的 SQL 片段前添加指定的前缀 |
suffix |
在 标签内的 SQL 片段后添加指定的后缀 |
prefixOverrides |
去除 标签内 SQL 片段开头匹配的字符序列(默认为空) |
suffixOverrides |
去除 标签内 SQL 片段结尾匹配的字符序列(默认为空) |
使用示例:
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO users
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null and name != ''">
name,
if>
<if test="age != null">
age,
if>
trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null and name != ''">
#{name},
if>
<if test="age != null">
#{age},
if>
trim>
insert>
标签
标签通常用于动态拼接更新语句的 SET 子句,它的核心功能是自动处理 SET
子句中的逗号。当
标签内部包含多个更新字段时,它会自动去掉最后一个字段后面多余的逗号,以此保证生成的 SQL 语句语法正确。
标签通常与其他条件判断标签(如
、
、
和
)结合使用。
使用示例:
<update id="updateByPrimaryKeySelective" parameterType="com.hstypay.bim.service.entity.GroupbyOrderDO">
update t_groupby_order
<set>
<if test="groupbyOrderId != null">
Fgroupby_order_id = #{groupbyOrderId,jdbcType=VARCHAR},
if>
set>
<where>
<if test="groupbyOrderId != null">
and Fgroupby_order_id = #{groupbyOrderId,jdbcType=VARCHAR}
if>
where>
update>
&&
标签
标签类似于 Java 中的 switch-case
语句,可用于根据不同的条件选择执行不同的 SQL 片段。
标签通常与
和
标签一起使用。
MyBatis 会按顺序检查每个
标签的 test
属性中的条件表达式,一旦找到一个条件表达式为 true
的
标签,就会执行该
标签内的 SQL 片段,并且不再检查后续的
标签。如果所有
标签的条件都不满足,则会执行
标签内的 SQL 片段。
使用示例:
<select id="selectUser" resultType="com.example.entity.User">
SELECT * FROM users
<where>
<choose>
<when test="id != null">
id = #{id}
when>
<when test="name != null and name != ''">
name = #{name}
when>
<otherwise>
age > 18
otherwise>
choose>
where>
select>
标签
标签用于循环遍历集合或数组,从而实现批量操作,如批量插入、批量删除、批量更新以及根据多个条件进行查询等。
在
标签中,常用的属性包括:
参数 | 描述 |
---|---|
collection | 指定要迭代的集合属性名。在方法参数是集合时,其值就是参数名;若参数是 JavaBean,它则是 JavaBean 中集合属性的名称。(可以通过 @Param 指定名称) |
item | 为集合中的每个元素设置的别名,在标签内部可通过这个别名引用元素。 |
open | 迭代内容的起始符号,例如在 SQL 的 IN 子句中,通常为 ( 。 |
close | 迭代内容的结束符号,如在 SQL 的 IN 子句中,一般是 ) 。 |
separator | 每次迭代之间的分隔符,像在 SQL 的 IN 子句中,通常是 , 。 |
使用示例:
<select id="selectProductsByIds" resultType="com.example.entity.Product">
SELECT * FROM products WHERE id IN
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
foreach>
select>
<insert id="batchInsertProducts">
INSERT INTO products (name) VALUES
<foreach collection="list" item="product" separator=",">
(#{product.name})
foreach>
insert>
/
标签
标签用于复用 SQL 片段,通常配合
标签一起使用,以简化 SQL 的编写并提高代码的可维护性。
标签必须定义在 SQL 语句所在的命名空间中,并且可以在命名空间内的其他 SQL 语句中通过
标签引用。
标签的 refid
属性指定了要引用的 SQL 片段的 id。
使用示例:
<sql id="userFields">
user_name, user_email, user_age
sql>
<select id="getUserList" parameterType="map" resultType="User">
SELECT <include refid="userFields" /> FROM user
select>