在上一节中,像下面写法
<select id="getPerson" resultType="com.lzj.bean.Person">
select * from person
<where>
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null and lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=''">
email=#{email} and
</if>
<if test="gender==0 or gender==1">
gender=#{gender}
</if>
</where>
</select>
and关键字加在每个if语句中国表字段的后面,如果最后一条判断语句失败,会导致整个sql语句最后多一个and关键字。下面可以通过<trim>
标签去掉多于的这个and关键字。改正如下
<select id="getPerson" resultType="com.lzj.bean.Person">
select * from person
<!-- 自定义字符串的截取规则,去掉最后一个and -->
<trim prefix="where" suffixOverrides="and">
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null and lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=''">
email=#{email} and
</if>
<!-- ognl会进行字符串与数字的转换判断 "0"==0 -->
<if test="gender==0 or gender==1">
gender=#{gender}
</if>
</trim>
</select>
下面介绍下<trim>
标签中的4个属性:
prefix : trim标签体中是整个字符串拼串 后的结果。prefix给拼串后的整个字符串加一个前缀。例如上面示例,如果只有id、email和gender语句判断成功的话,<trim>
标签中的sql语句拼接结果为:
id=#{id} and email=#{email} and gender=#{gender}
而prefix表示在整个 标签内部包裹的字符串拼接的结果的前面加指定的字符。所以prefix=”where”表示在拼接的结果前面加一个where字符串,所以最后拼接的字符串加上where就变成了:
where id=#{id} and email=#{email} and gender=#{gender}
prefixOverrides : 前缀覆盖: 去掉整个字符串前面多余的字符。例如
<select id="getPerson" resultType="com.lzj.bean.Employee">
select * from tbl_employee
where
<!--去掉拼接后的多于的and字符-->
<trim prefixOverrides="and">
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null and lastName!=''">
and last_name like #{lastName}
</if>
<if test="email!=null and email.trim()!=''">
and email=#{email}
</if>
<if test="gender==0 or gender==1">
and gender=#{gender}
</if>
</trim>
</select>
当id条件判断失败,其它三个条件判断成功后, 标签包裹的字符串拼接结果为:
and last_name like #{lastName} and email=#{email} and gender=#{gender}
拼接的结果中前面多一个and字符串,所以prefixOverrides=”and”的作用就是去掉拼接结果最前面多于的and字符串的。
suffixOverrides : 后缀覆盖:去掉整个字符串后面多余的字符。例如最开始给出的一个例子就是后缀覆盖
<select id="getPerson" resultType="com.lzj.bean.Person">
select * from person
<!-- 自定义字符串的截取规则,去掉最后一个and -->
<trim prefix="where" suffixOverrides="and">
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null and lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=''">
email=#{email} and
</if>
<if test="gender==0 or gender==1">
gender=#{gender}
</if>
</trim>
</select>
当gender的判断条件失败时, 标签包裹的字符串拼接结果为:
id=#{id} and last_name like #{lastName} and email=#{email} and
字符串的拼接结果的最后多一个and字符串。suffixOverrides=”and”表示去掉拼接结果最后的and字符串的意思。所以<trim prefix="where" suffixOverrides="and">
表示把拼接的结果id=#{id} and last_name like #{lastName} and email=#{email} and
前面加where字符串,后面去掉and字符串,最后变为:
where id=#{id} and last_name like #{lastName} and email=#{email}
suffix : 后缀,suffix给拼串后的整个字符串加一个后缀 。目前用的甚少,就是在拼接结果的最后加一个字符串。