mybatis之mapper.xml

一、mapper.xml使用

1、<where>标签

      如果该标签包含的元素中有返回值,就插入一个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更干净,更贴切。 

2、<sql>标签

sql标签 里面可以写入一个共同的sql代码,用于提取重复的代码。 要使用该代码的时候就直接使用<include> 标签  id: 为提取的sql代码,取一个id,起标识作用。

3、for循环

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>

4、mapper.xml 与mapper  入参map中有list参数

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>

猜你喜欢

转载自blog.csdn.net/weixin_40482816/article/details/114871096