准備工作
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; } }
使用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()); }