如果该标签包含的元素中有返回值,就插入一个where,如果后面的字符串是以and 和 or 开头,就将他们剔除。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.RelationMapper">
<sql id="selectSql">
post.post_id AS postId,
post.post_name AS postName,
org.org_id AS orgId,
org.org_name AS orgName,
org_post_relation.created_date AS createdStamp,
org_post_relation.updated_date AS lastUpdatedStamp
</sql>
<select id="queryRelation" resultType="com.example.demo.web.vo.RelationResultMap"
parameterType="com.example.demo.web.form.RelationQueryForm">
SELECT
<include refid="selectSql" />
FROM
org_post_relation
inner join post on org_post_relation.post_id = post.post_id
inner join org on org_post_relation.org_id = org.org_id
<where>
-- form 入参bean
<if test="form.postId != null and form.postId != ''">
AND post.post_id LIKE CONCAT('%',#{form.postId},'%')
</if>
<if test="form.postName != null and form.postName != ''">
AND post.post_name LIKE CONCAT('%',#{form.postName},'%')
</if>
<if test="form.orgId != null and form.orgId != ''">
AND org.org_id LIKE CONCAT('%',#{form.orgId},'%')
</if>
<if test="form.orgName != null and form.orgName != ''">
AND org.org_name LIKE CONCAT('%',#{form.orgName},'%')
</if>
</where>
<if test="form.orderBy != null and form.orderBy != ''">
<if test="form.highToLow == null or form.highToLow == false">
ORDER BY ${form.orderBy} ASC
</if>
<if test="form.highToLow != null and form.highToLow == true">
ORDER BY ${form.orderBy} DESC
</if>
</if>
</select>
</mapper>
当if条件都不满足的时候,where元素中没有内容,所以在SQL中不会出现where,也就不存在前面在where中使用if标签中SQL错误的问题。如果if条件满足,where元素的内容就是以and开头的条件,where会自动去掉开头的and,这也能保证where条件正确。这种情况下生成的SQL更干净,更贴切。
sql标签 里面可以写入一个共同的sql代码,用于提取重复的代码。 要使用该代码的时候就直接使用<include> 标签 id: 为提取的sql代码,取一个id,起标识作用。
foreach属性
属性 | 描述 |
---|---|
item | 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。 具体说明:在list和数组中是其中的对象,在map中是value。 该参数为必选。 |
collection | 要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。 当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子: 如果User有属性List ids。入参是User对象,那么这个collection = "ids" 如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id" 上面只是举例,具体collection等于什么,就看你想对那个元素做循环。 该参数为必选。 |
separator | 元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。 |
open | foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。 |
close | foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。 |
index | 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。当前 List 集合遍历次数的 计数器。 |
代码示例:
SELECT
ua.user_login_id AS userLoginId,
p.user_id AS userId,
p.user_name AS userName,
p.org_id AS orgId,
FROM
user_auth AS ua
INNER JOIN user_login AS ul on ua.user_login_id = ul.user_login_id
INNER JOIN person AS p on ul.user_id = p.user_id
INNER JOIN org AS bo on p.org_id = bo.org_id
<where>
<if test="form.orgIds != null and form.orgIds.size() > 0 ">
AND p.org_id IN
<foreach collection="form.orgIds" item="orgId" open="(" close=")" separator=",">
#{orgId}
</foreach>
</if>
<if test="form.userId != null and form.userId != ''">
AND p.userId LIKE CONCAT('%',#{form.userId},'%')
</if>
<if test="form.userName != null and form.userName != ''">
AND p.last_name LIKE CONCAT('%',#{form.userName},'%')
</if>
<if test="form.userLoginId != null and form.userLoginId != ''">
AND ul.userLoginId LIKE CONCAT('%',#{form.userLoginId},'%')
</if>
</where>
<if test="form.orderBy != null and form.orderBy != ''">
<if test="form.highToLow == null or form.highToLow == false">
ORDER BY ${form.orderBy} ASC
</if>
<if test="form.highToLow != null and form.highToLow == true">
ORDER BY ${form.orderBy} DESC
</if>
</if>
List<UserAuth> queryUserAuth(Page<UserAuth> page, @Param("form") Map<String, Object> inputMap);
对应mapper.xml中list的使用:
入参类型parameterType: java.util.Map
<select id="queryUserAuth" resultType="com.hoperun.iap.web.vo.auth.UserAuth" parameterType="java.util.Map">
list使用:
<if test="form.orgIds != null and form.orgIds.size() > 0 ">
AND p.org_id IN
<foreach collection="form.orgIds" item="orgId" open="(" close=")" separator=",">
#{orgId}
</foreach>
</if>