1.prefix 前缀增加的内容
2.suffix 后缀增加的内容
3.prefixOverrides 前缀需要覆盖的内容,一般是第一个判断条件前面的多余的结构,如:第一个判断条件前面多了 ‘and
’
select * from User where name='zhangsan' and age='20';
<select id='queryUser'>
select * from User
<trim prefix='where' prefixOverrides='and'>
<if test="name != null and name != ''">
name = #{name}
</if>
<if test="age !=null and age !=''">
and age = #{age}
</if>
</trim>
<select>
第一个条件前面没有任何符号,第二个条件要加上and,否则sql语句会报错。很理想的状态是第一个和第二个都有值,但是既然判断,说明也可能会没有值,当第一个name没有值的时候,这个时候sql语句就会是
select * from User where and age=''
,很明显这个sql语句语法存在问题。在这里标签属性prefixOverrides
就起作用了,它会让前缀where
覆盖掉第一个and
。覆盖之后的是:select * from User where age='';
4.suffixOverrides 后缀需要覆盖的内容,一般是最后一个数据的后面符号,如:set值的时候,最后一个值的后面多一个逗号‘,’
<insert id="insertSelective" parameterType="org.javaboy.vhr.model.Salary">
insert into salary
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="basicSalary != null">
basicSalary,
</if>
<if test="bonus != null">
bonus,
</if>
<if test="lunchSalary != null">
lunchSalary,
</if>
<if test="trafficSalary != null">
trafficSalary,
<if test="name != null">
name,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=INTEGER},
</if>
<if test="basicSalary != null">
#{basicSalary,jdbcType=INTEGER},
</if>
<if test="bonus != null">
#{bonus,jdbcType=INTEGER},
</if>
<if test="lunchSalary != null">
#{lunchSalary,jdbcType=INTEGER},
</if>
<if test="trafficSalary != null">
#{trafficSalary,jdbcType=INTEGER},
</if>
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
</trim>
</insert>
加了
suffixOverrides=","
结果: insert into salary (id,basicSalary,bonus,lunchSalary,trafficSalary,name) values (#{id},#{basicSalary},#{bonus},#{lunchSalary},#{trafficSalary},#{name})不加
suffixOverrides=","
结果: insert into salary (id,basicSalary,bonus,lunchSalary,trafficSalary,name,
) values (#{id},#{basicSalary},#{bonus},#{lunchSalary},#{trafficSalary},#{name},
)加了
suffixOverrides=","
的话,本例中最后一个条件中的逗号“,”会被后缀覆盖掉