您的位置:首页 > 数据库

17、动态SQL之<trim>

2018-01-20 23:56 204 查看
在上一节中,像下面写法

<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给拼串后的整个字符串加一个后缀 。目前用的甚少,就是在拼接结果的最后加一个字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: