MyBatis(四):mybatis中使用in查詢時的注意事項


准備工作

1)創建測試表
jobitem

CREATE TABLE "jobitem" (
  "id" bigint(20) NOT NULL AUTO_INCREMENT COMMENT '唯一鍵 pk',
  "appId" varchar(32) NOT NULL COMMENT 'yarn任務id(applicationId)',
  "submitFilePath" varchar(256) NOT NULL COMMENT '提交腳本路徑',
  "state" varchar(16) DEFAULT NULL COMMENT '任務狀態',
  "monitorType" varchar(512) DEFAULT NULL COMMENT '監控列表',
  "createUserId" varchar(32) NOT NULL COMMENT '創建者關聯Id',
  "createUserName" varchar(32) NOT NULL COMMENT '創建者用戶名',
  "createTime" datetime NOT NULL COMMENT '創建時間',
  PRIMARY KEY ("id"),
  UNIQUE KEY "key" ("appId")
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='yarn任務持久化存儲對象';

備注:這里mysql版本是5.7

2)使用mybatis-generator-plugin生成實體類:

Jobitem.java

package com.boco.jobmonitor.model;

import java.util.Date;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

public class Jobitem {
    /**
     * 唯一鍵 pk<br>
     * 列名:id 類型:INTEGER(10) 允許空:false 缺省值:null
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * yarn任務id(applicationId)<br>
     * 列名:appId 類型:VARCHAR(32) 允許空:false 缺省值:null
     */
    private String appid;

    /**
     * 提交腳本路徑<br>
     * 列名:submitFilePath 類型:VARCHAR(256) 允許空:false 缺省值:null
     */
    private String submitfilepath;

    /**
     * 任務狀態<br>
     * 列名:state 類型:VARCHAR(16) 允許空:true 缺省值:null
     */
    private String state;

    /**
     * 監控列表<br>
     * 列名:monitorType 類型:VARCHAR(512) 允許空:true 缺省值:null
     */
    private String monitortype;

    /**
     * 創建者關聯Id<br>
     * 列名:createUserId 類型:VARCHAR(32) 允許空:false 缺省值:null
     */
    private String createuserid;

    /**
     * 創建者用戶名<br>
     * 列名:createUserName 類型:VARCHAR(32) 允許空:false 缺省值:null
     */
    private String createusername;

    /**
     * 創建時間<br>
     * 列名:createTime 類型:TIMESTAMP(19) 允許空:false 缺省值:null
     */
    private Date createtime;

    public Jobitem() {
    }

    public Jobitem(String appid, String submitfilepath, String state, String monitortype, String createuserid,
            String createusername, Date createtime) {
        super();
        this.appid = appid;
        this.submitfilepath = submitfilepath;
        this.state = state;
        this.monitortype = monitortype;
        this.createuserid = createuserid;
        this.createusername = createusername;
        this.createtime = createtime;
    }

    public Jobitem(Long id, String appid, String submitfilepath, String state, String monitortype,
            String createuserid, String createusername, Date createtime) {
        super();
        this.id = id;
        this.appid = appid;
        this.submitfilepath = submitfilepath;
        this.state = state;
        this.monitortype = monitortype;
        this.createuserid = createuserid;
        this.createusername = createusername;
        this.createtime = createtime;
    }

    /**
     * 唯一鍵 pk
     * 
     * @author boco
     * @return id 唯一鍵 pk
     */
    public Long getId() {
        return id;
    }

    /**
     * 唯一鍵 pk
     * 
     * @author boco
     * @param id
     *            唯一鍵 pk
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * yarn任務id(applicationId)
     * 
     * @author boco
     * @return appId yarn任務id(applicationId)
     */
    public String getAppid() {
        return appid;
    }

    /**
     * yarn任務id(applicationId)
     * 
     * @author boco
     * @param appid
     *            yarn任務id(applicationId)
     */
    public void setAppid(String appid) {
        this.appid = appid == null ? null : appid.trim();
    }

    /**
     * 提交腳本路徑
     * 
     * @author boco
     * @return submitFilePath 提交腳本路徑
     */
    public String getSubmitfilepath() {
        return submitfilepath;
    }

    /**
     * 提交腳本路徑
     * 
     * @author boco
     * @param submitfilepath
     *            提交腳本路徑
     */
    public void setSubmitfilepath(String submitfilepath) {
        this.submitfilepath = submitfilepath == null ? null : submitfilepath.trim();
    }

    /**
     * 任務狀態
     * 
     * @author boco
     * @return state 任務狀態
     */
    public String getState() {
        return state;
    }

    /**
     * 任務狀態
     * 
     * @author boco
     * @param state
     *            任務狀態
     */
    public void setState(String state) {
        this.state = state == null ? null : state.trim();
    }

    /**
     * 監控列表
     * 
     * @author boco
     * @return monitorType 監控列表
     */
    public String getMonitortype() {
        return monitortype;
    }

    /**
     * 監控列表
     * 
     * @author boco
     * @param monitortype
     *            監控列表
     */
    public void setMonitortype(String monitortype) {
        this.monitortype = monitortype == null ? null : monitortype.trim();
    }

    /**
     * 創建者關聯Id
     * 
     * @author boco
     * @return createUserId 創建者關聯Id
     */
    public String getCreateuserid() {
        return createuserid;
    }

    /**
     * 創建者關聯Id
     * 
     * @author boco
     * @param createuserid
     *            創建者關聯Id
     */
    public void setCreateuserid(String createuserid) {
        this.createuserid = createuserid == null ? null : createuserid.trim();
    }

    /**
     * 創建者用戶名
     * 
     * @author boco
     * @return createUserName 創建者用戶名
     */
    public String getCreateusername() {
        return createusername;
    }

    /**
     * 創建者用戶名
     * 
     * @author boco
     * @param createusername
     *            創建者用戶名
     */
    public void setCreateusername(String createusername) {
        this.createusername = createusername == null ? null : createusername.trim();
    }

    /**
     * 創建時間
     * 
     * @author boco
     * @return createTime 創建時間
     */
    public Date getCreatetime() {
        return createtime;
    }

    /**
     * 創建時間
     * 
     * @author boco
     * @param createtime
     *            創建時間
     */
    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }
}
View Code

使用List對sql in進行傳參時

如果參數的類型是List, 則在使用時,collection屬性要必須指定為 list
JobitemMapper接口類:

 List<Jobitem> findByIdList(List<String> appIds);

對應JobitemMapper.xml文件配置:

<?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.dx.jobmonitor.mapper.JobitemMapper" >
  <resultMap id="BaseResultMap" type="com.dx.jobmonitor.model.Jobitem" >  
  <!--
      WARNING - @mbggenerated
    -->
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="appId" property="appid" jdbcType="VARCHAR" />
    <result column="submitFilePath" property="submitfilepath" jdbcType="VARCHAR" />
    <result column="state" property="state" jdbcType="VARCHAR" />
    <result column="monitorType" property="monitortype" jdbcType="VARCHAR" />
    <result column="createUserId" property="createuserid" jdbcType="VARCHAR" />
    <result column="createUserName" property="createusername" jdbcType="VARCHAR" />
    <result column="createTime" property="createtime" jdbcType="TIMESTAMP" />
  </resultMap>  
  <sql id="Base_Column_List" >
    <!--
      WARNING - @mbggenerated
    -->
    id,appId,submitFilePath,state,monitorType,createUserId,createUserName,createTime
  </sql>
  <select id="findByIdList" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from _jobitem where appId in
        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
             #{item}
        </foreach>
  </select> 
</mapper>

測試代碼:

package com.dx.jobmonitor.web;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.dx.jobmonitor.App;
import com.dx.jobmonitor.mapper.JobitemMapper;
import com.dx.jobmonitor.model.Jobitem;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { App.class, obitemMapper.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class JobitemTest {

    @Autowired
    private JobitemMapper sJobitemMapper;

    @Test
    public void testFindByIdList() {
        List<String> appIds = new ArrayList<String>();
        appIds.add("application_1548381669007_0057");
        appIds.add("application_1548381669007_0056");
        appIds.add("application_1548381669007_0055");

        List<Jobitem> result = sJobitemMapper.findByIdList(appIds);

        Assert.assertEquals(3, result.size());
    }
}

使用Array對sql in進行傳參時

如果參數的類型是Array,則在使用時,collection屬性要必須指定為 array
JobitemMapper接口類:

    List<Jobitem> findByIdArray(String[] appIds);

對應JobitemMapper.xml文件配置:

  <select id="findByIdArray" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from _jobitem where appId in
        <foreach item="item" index="index" collection="array" open="(" separator="," close=")">
             #{item}
        </foreach>
  </select>

測試代碼:

    @Test
    public void testFindByIdArray() {
        String[] appIds = new String[] { "application_1548381669007_0057", "application_1548381669007_0056",
                "application_1548381669007_0055" };

        List<Jobitem> result = sJobitemMapper.findByIdArray(appIds);

        Assert.assertEquals(3, result.size());
    }

使用Map對sql in傳遞多參數時

當查詢的參數有多個時,例如 findByIds(String name, Long[] ids)。這種情況需要特別注意,在傳參數時,一定要改用Map方式, 這樣在collection屬性可以指定名稱
JobitemMapper接口類:

    List<Jobitem> findByIdMap(Map<String, Object> creatorAndappIds);

對應JobitemMapper.xml文件配置:

  <select id="findByIdMap" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from _jobitem 
        where createUserName=#{username,jdbcType=VARCHAR}
        and appId in
        <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
             #{item}
        </foreach>
  </select>

測試代碼:

    @Test
    public void testFindByIdMap() {
        Map<String, Object> creatorAndappIds = new HashMap<String, Object>();
        creatorAndappIds.put("username", "admin");
        String[] appIds = new String[] { "application_1548381669007_0057", "application_1548381669007_0056",
                "application_1548381669007_0055" };
        creatorAndappIds.put("ids", appIds);

        List<Jobitem> result = sJobitemMapper.findByIdMap(creatorAndappIds);

        Assert.assertEquals(3, result.size());
    }

    @Test
    public void testFindByIdMap2() {
        Map<String, Object> creatorAndappIds = new HashMap<String, Object>();
        creatorAndappIds.put("username", "admin");
        List<String> appIds = new ArrayList<String>();
        appIds.add("application_1548381669007_0057");
        appIds.add("application_1548381669007_0056");
        appIds.add("application_1548381669007_0055");
        creatorAndappIds.put("ids", appIds);

        List<Jobitem> result = sJobitemMapper.findByIdMap(creatorAndappIds);

        Assert.assertEquals(3, result.size());
    }

使用string...對sql in進行傳參時

JobitemMapper接口類:

    List<Jobitem> findByIdMutilParams(String... appIds);

對應JobitemMapper.xml文件配置:

  <select id="findByIdMutilParams" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from _jobitem 
        where appId in
        <foreach item="item" index="index" collection="array" open="(" separator="," close=")">
             #{item}
        </foreach>
  </select>

測試代碼:

    @Test
    public void testFindByIdMultiParams() {
        List<Jobitem> result = sJobitemMapper.findByIdMutilParams("application_1548381669007_0057",
                "application_1548381669007_0056", "application_1548381669007_0055");

        Assert.assertEquals(3, result.size());
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM