Explicação detalhada do uso de tags de corte mybatis
A tag trim de mybatis é geralmente usada para remover palavras-chave e vírgulas redundantes em instruções SQL, ou para unir "where", "set" e "values(" e outros prefixos, ou adicionar ")" e outros sufixos antes de instruções SQL, que podem ser usadas Operações como inserção seletiva, atualização, exclusão ou consulta condicional.
A seguir estão os atributos envolvidos na tag de corte:
prefix=adicionar prefixo suffix=adicionar sufixo
prefixOverrides=Remover prefixo suffixOverrides=Remover sufixo
Atributos | descrever |
---|---|
prefixo | O prefixo para splicing de instrução sql |
sufixo | O sufixo para splicing de instrução sql |
prefixOverrides | Remova a palavra-chave ou caractere na frente da instrução sql, a palavra-chave ou caractere é especificado pelo atributo prefixOverrides, supondo que o atributo seja especificado como "AND", quando o início da instrução sql for "AND", a tag de corte será remova o "E" |
suffixOverrides | Remova palavras-chave ou caracteres após a instrução sql, que são especificados pelo atributo suffixOverrides |
1. Use a tag de corte para remover palavras-chave e palavras-chave redundantes (em comparação com where)
<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>
O que acontece se nenhuma dessas condições corresponder? No final, esse SQL ficará assim:
SELECT * FROM BLOG
WHERE
Isso faz com que a consulta falhe. E se apenas a segunda condição corresponder? Este SQL ficará assim:
SELECT * FROM BLOG
WHERE
AND title like 'someTitle'
Você pode usar a tag where para resolver este problema, o elemento where só irá inserir a cláusula "WHERE" se houver pelo menos um elemento filho cuja condição retorne uma cláusula SQL. Além disso, se a instrução começar com "AND" ou "OR", o elemento where também os 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>
A tag de corte também pode realizar a mesma função, escrita da seguinte forma:
<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 a tag de corte para remover vírgulas extras
Se as condições na caixa vermelha não forem atendidas, a instrução sql será a seguinte:
INSERT INTO role(role_name,) VALUES(roleName,)
A inserção falhará com vírgulas extras.
O uso da tag de corte pode resolver esse problema com uma pequena modificação, como segue:
os atributos mais importantes são
suffixOverrides=","
Indica para remover a vírgula extra no final da instrução sql.
Ao mesmo tempo, para esclarecer a relação entre vários atributos de trim, os dois xmls a seguir são 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>
Ou seja, no início:
prefix=添加前缀
suffix=添加后缀
prefixOverrides=去掉前缀
suffixOverrides=去掉后缀