如图,mybatis的xml中,红框中的 states与item是什么意思呀?并没有这两个参数呀?

   <select id="getContractList" resultType="com.lqb.web.entity.Contract" parameterType="com.lqb.web.entity.Contract">
        select a.id , a.contract_num,date_format(a.start_date,'%Y-%m-%d') AS  startDate, date_format(a.end_date,'%Y-%m-%d') AS  endDate,
        date_format(a.rent_start_date,'%Y-%m-%d') AS  rentStartDate,a.state,a.type,a.reson,
        a.room_type as roomType,a.price as price ,a.remarks as remarks,a.create_date as createDate,a.create_by as createBy,a.pay_type1 as payType1,
        a.pay_type2 as payType2,b.mansion_id as mansionId,b.`name` as ` rentRoom.name`,b.`area` as `rentRoom.area`,
        c.`name` as `tenantry.name`,c.`contact` as `tenantry.contact`,c.`mobile` as `tenantry.mobile`,c.`company_type` as `tenantry.companyType`,c.`employee_count` as `tenantry.employeeCount`,
        e.`name` as `letter.name`,e.`company_address` as `letter.companyAddress`,a.deposit,u.name AS createUser
        FROM contract a
        left JOIN rent_room b ON a.`id`=b.`contract_id`
        left JOIN tenantry c ON a.`id`=c.`contract_id`
        left JOIN letter e ON a.`id`=e.`contract_id`
        left join user u on a.create_by = u.id
        <where>
            (c.state!=-1 OR  c.state is NULL)

            <if test="name != null">
                AND a.name like #{name}
            </if>
            <if test="createBy != null">
                and a.create_by = #{createBy}
            </if>
            <if test="mansionId!= null">
                AND b.mansion_id = #{mansionId}
            </if>
            <if test="letter != null and letter.name != null  and letter.name != ''">
                and e.name like #{letter.name}
            </if>

            <if test="tenantry != null and tenantry.name != null  and tenantry.name != ''">
                and c.name like #{tenantry.name}
            </if>

            <if test="area != '' and area != null ">
              and  area = #{area}
            </if>
            <if test="minArea != '' and minArea != null and maxArea != '' and maxArea != null">
                <![CDATA[
                and  b.area >= #{minArea}
                AND  b.area <= #{maxArea}
               ]]>
            </if>
            <if test="startDate != '' and startDate != null and endDate != '' and endDate != null">
                <![CDATA[
              and (DATE_FORMAT(a.start_date, '%Y-%m-%d') BETWEEN  DATE_FORMAT(#{startDate}, '%Y-%m-%d') AND DATE_FORMAT(#{endDate}, '%Y-%m-%d')
              OR DATE_FORMAT(a.end_date, '%Y-%m-%d') BETWEEN  DATE_FORMAT(#{startDate}, '%Y-%m-%d') AND DATE_FORMAT(#{endDate}, '%Y-%m-%d')
              OR DATE_FORMAT(#{startDate}, '%Y-%m-%d') BETWEEN  DATE_FORMAT(a.start_date, '%Y-%m-%d') AND DATE_FORMAT(a.end_date, '%Y-%m-%d')
              OR DATE_FORMAT(#{endDate}, '%Y-%m-%d') BETWEEN  DATE_FORMAT(a.start_date, '%Y-%m-%d') AND DATE_FORMAT(a.end_date, '%Y-%m-%d'))
                 ]]>
            </if>

          <if test="startDate == null and endDate != null">
            <![CDATA[
              AND DATE_FORMAT(end_date, '%Y-%m-%d') <=  DATE_FORMAT(#{endDate}, '%Y-%m-%d')
             ]]>
          </if>
            <if test="chooseStartDate != '' and chooseStartDate != null and chooseEndDate != '' and chooseEndDate != null">
                <![CDATA[
              and (DATE_FORMAT(a.start_date, '%Y-%m-%d') BETWEEN  DATE_FORMAT(#{chooseStartDate}, '%Y-%m-%d') AND DATE_FORMAT(#{chooseEndDate}, '%Y-%m-%d')
              OR DATE_FORMAT(a.end_date, '%Y-%m-%d') BETWEEN  DATE_FORMAT(#{chooseStartDate}, '%Y-%m-%d') AND DATE_FORMAT(#{chooseEndDate}, '%Y-%m-%d')
              OR DATE_FORMAT(#{chooseStartDate}, '%Y-%m-%d') BETWEEN  DATE_FORMAT(a.start_date, '%Y-%m-%d') AND DATE_FORMAT(a.end_date, '%Y-%m-%d')
              OR DATE_FORMAT(#{chooseEndDate}, '%Y-%m-%d') BETWEEN  DATE_FORMAT(a.start_date, '%Y-%m-%d') AND DATE_FORMAT(a.end_date, '%Y-%m-%d'))
                 ]]>
            </if>

            <if test="payType1 != '' and payType1 != null ">
              AND pay_type1 = #{payType1}
            </if>

            <if test="payType2 != '' and payType2 != null ">
                AND pay_type2 = #{payType2}
            </if>

            <if test="roomType != '' and roomType != null ">
              AND room_type = #{roomType}
            </if>

            <if test="mansionId != '' and mansionId != null ">
                AND b.mansion_id = #{mansionId}
            </if>

            <if test="states != null">
                AND a.state in <foreach  item="item" collection="states" index="index"  open="(" separator="," close=")">#{item}</foreach>
            </if>

        </where>
        ORDER BY a.`create_date` DESC
        Limit #{startPos},#{pageSize}
    </select>

图片描述

阅读 2.3k
2 个回答
        <if test="states != null">
            AND a.state in <foreach  item="item" collection="states" index="index"  open="(" separator="," close=")">#{item}</foreach>
        </if>
        这句话的意思是判断states集合是否为空,不为空,遍历,item是集合中迭代时的别名

oreach元素的属性主要有item,index,collection,open,separator,close。

item:集合中元素迭代时的别名,
index:集合中元素迭代时的索引
open:常用语where语句中,表示以什么开始,比如以'('开始
separator:表示在每次进行迭代时的分隔符,
close 常用语where语句中,表示以什么结束,

按照官方文档关于 if说明itemstates 这个集合中的元素,这是 foreach 标签中 item 属性指定的名称,而 states 应该是外部传入的参数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题