Explicación detallada del uso de las etiquetas de corte mybatis
La etiqueta de corte de mybatis generalmente se usa para eliminar palabras clave redundantes y comas en las declaraciones de SQL, o para unir "dónde", "establecer" y "valores ("y otros prefijos, o agregar ")" y otros sufijos antes de las declaraciones de SQL, que se pueden utilizar Operaciones como inserción selectiva, actualización, eliminación o consulta condicional.
Los siguientes son los atributos involucrados en la etiqueta de corte:
prefijo=agregar prefijo sufijo=agregar sufijo
prefixOverrides=Eliminar prefijo suffixOverrides=Eliminar sufijo
Atributos | describir |
---|---|
prefijo | El prefijo para el empalme de declaraciones sql |
sufijo | El sufijo para el empalme de declaraciones sql |
prefijoAnula | Elimine la palabra clave o el carácter delante de la instrucción sql, la palabra clave o el carácter se especifica mediante el atributo prefixOverrides, asumiendo que el atributo se especifica como "AND", cuando el comienzo de la instrucción sql es "AND", la etiqueta de recorte eliminar el "Y" |
anulaciones de sufijo | Eliminar palabras clave o caracteres después de la instrucción sql, que se especifican mediante el atributo suffixOverrides |
1. Use la etiqueta de recorte para eliminar palabras clave redundantes y (en comparación con dónde)
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE
<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>
</select>
¿Qué sucede si ninguna de estas condiciones coincide? Al final, este SQL quedará así:
SELECT * FROM BLOG
WHERE
Esto hace que la consulta falle. ¿Qué pasa si solo la segunda condición coincide? Este SQL terminará así:
SELECT * FROM BLOG
WHERE
AND title like 'someTitle'
Puede usar la etiqueta where para resolver este problema, el elemento where solo insertará la cláusula "WHERE" si hay al menos un elemento secundario cuya condición devuelve una cláusula SQL. Además, si la instrucción comienza con "Y" u "O", el elemento where también los eliminará.
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<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>
La etiqueta de recorte también puede realizar la misma función, escrita de la siguiente manera:
<trim prefix="WHERE" prefixOverrides="AND">
<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>
</trim>
2. Use la etiqueta de recorte para eliminar las comas adicionales
Si las condiciones en el cuadro rojo no coinciden, la instrucción sql será la siguiente:
INSERT INTO role(role_name,) VALUES(roleName,)
La inserción fallará con comas adicionales.
El uso de la etiqueta de recorte puede resolver este problema con una pequeña cantidad de modificación, de la siguiente manera:
los atributos más importantes son
suffixOverrides=","
Indica que se elimine la coma adicional al final de la instrucción sql.
Al mismo tiempo, para aclarar la relación entre varios atributos de recorte, los siguientes dos xml son equivalentes
<insert id="insertSelective">
insert into BZ_EVENTINFOGS
(
<if test="eventinfoid != null">
EVENTINFOID,
</if>
<if test="eventinfoname != null">
EVENTINFONAME,
</if>
)
values (
<if test="eventinfoid != null">
#{eventinfoid,jdbcType=VARCHAR},
</if>
<if test="eventinfoname != null">
#{eventinfoname,jdbcType=VARCHAR},
</if>
)
Equivalente a
<insert id="insertSelective">
insert into BZ_EVENTINFOGS
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="eventinfoid != null">
EVENTINFOID,
</if>
<if test="eventinfoname != null">
EVENTINFONAME,
</if>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="eventinfoid != null">
#{eventinfoid,jdbcType=VARCHAR},
</if>
<if test="eventinfoname != null">
#{eventinfoname,jdbcType=VARCHAR},
</if>
Es decir al principio:
prefix=添加前缀
suffix=添加后缀
prefixOverrides=去掉前缀
suffixOverrides=去掉后缀