mybatis中association和collection的column传入多个参数值
项目中在使用association和collection实现一对一和一对多关系时需要对关系中结果集进行筛选,如果使用懒加载模式,即联合使用select
标签时,主sql和关系映射里的sql是分开的,查询参数传递成为问题。
mybatis文档:
property | description |
---|---|
column | 数据库的列名或者列标签别名。与传递给resultSet.getString(columnName)的参数名称相同。注意: 在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。 |
<resultMap id="findCountryCityAddressMap" type="map">
<result property="country" column="country"/>
<collection property="cityList"
column="{cityId=city_id,adr=addressCol, dis=districtCol}" //adr作为第二个sql查询条件key,即prop1属性
ofType="map" //addressCol即为虚拟列名
javaType="java.util.List" select="selectAddressByCityId"/>
</resultMap>
column中放入多个值,然后使用逗号隔开即可。
这里使用一级分行、二级分行、支行名称来模拟后台的三级联动的list(省市区的也是一样,在此不再赘述)
需求:获取所有的分支行信息:一级分行下面有二级分行,相应的二级分行下面有对应的支行信息。
model层:
一级分行实体 :
package com.smp.model.allbankinfo;
import java.io.Serializable;
import java.util.List;
/**
* <p>
* 一级分行实体
* </p>
*
* @author
* @date 2018-11-14
*
*/
public class ParentBrach implements Serializable {
@Override
public String toString() {
return "ParentBrach [parentBrachId=" + parentBrachId + ", parentBrachname=" + parentBrachname + ", brachList="
+ brachList + "]";
}
public String getParentBrachId() {
return parentBrachId;
}
public void setParentBrachId(String parentBrachId) {
this.parentBrachId = parentBrachId;
}
public String getParentBrachname() {
return parentBrachname;
}
public void setParentBrachname(String parentBrachname) {
this.parentBrachname = parentBrachname;
}
public List<Brach> getBrachList() {
return brachList;
}
public void setBrachList(List<Brach> brachList) {
this.brachList = brachList;
}
private static final long serialVersionUID = -3997264254867474971L;
/**
* 一级分行ID
*/
private String parentBrachId;
/**
* 一级分行名
*/
private String parentBrachname;
/**
* 一级分行下面的二级分行列表
*/
private List<Brach> brachList;
}
二级分行实体 :
package com.smp.model.allbankinfo;
import java.io.Serializable;
import java.util.List;
/**
* <p>
* 二级分行实体
* </p>
*
* @author
* @date 2018-11-14
*
*/
public class Brach implements Serializable {
@Override
public String toString() {
return "Brach [branchId=" + branchId + ", branchName=" + branchName + ", parentBranchId=" + parentBranchId
+ ", subBrachList=" + subBrachList + "]";
}
public String getBranchId() {
return branchId;
}
public void setBranchId(String branchId) {
this.branchId = branchId;
}
public String getBranchName() {
return branchName;
}
public void setBranchName(String branchName) {
this.branchName = branchName;
}
public String getParentBranchId() {
return parentBranchId;
}
public void setParentBranchId(String parentBranchId) {
this.parentBranchId = parentBranchId;
}
public List<SubBrach> getSubBrachList() {
return subBrachList;
}
public void setSubBrachList(List<SubBrach> subBrachList) {
this.subBrachList = subBrachList;
}
private static final long serialVersionUID = -1635709625244302813L;
/**
* 二级分行ID
*/
private String branchId;
/**
* 二级分行名
*/
private String branchName;
/**
* 所属的一级分行ID
*/
private String parentBranchId;
/**
* 二级分行旗下的支行列表
*/
private List<SubBrach> subBrachList;
}
支行实体 :
package com.smp.model.allbankinfo;
import java.io.Serializable;
/**
* <p>
* 支行实体
* </p>
*
* @author
* @date 2018-11-14
*
*/
public class SubBrach implements Serializable {
@Override
public String toString() {
return "SubBrach [subBranchId=" + subBranchId + ", subBranchCode=" + subBranchCode + ", subBranchName="
+ subBranchName + ", branchId=" + branchId + "]";
}
public String getSubBranchId() {
return subBranchId;
}
public void setSubBranchId(String subBranchId) {
this.subBranchId = subBranchId;
}
public String getSubBranchCode() {
return subBranchCode;
}
public void setSubBranchCode(String subBranchCode) {
this.subBranchCode = subBranchCode;
}
public String getSubBranchName() {
return subBranchName;
}
public void setSubBranchName(String subBranchName) {
this.subBranchName = subBranchName;
}
public String getBranchId() {
return branchId;
}
public void setBranchId(String branchId) {
this.branchId = branchId;
}
private static final long serialVersionUID = 3306493316002559960L;
/**
* 支行ID
*/
private String subBranchId;
/**
* 支行机构码
*/
private String subBranchCode;
/**
* 支行名字
*/
private String subBranchName;
/**
* 所属的二级分行ID
*/
private String branchId;
}
dao层:
一级分行
/**
*
*/
package com.smp.orgManage.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.smp.model.BraOffRecParentBra;
import com.smp.model.allbankinfo.ParentBrach;
/**
* <p>一级分行mapper接口</p>
*
* @author gaozhenghong
* @date 2018年3月6日
*
*/
public interface OnlineBraOffRecParentBraMapperExt {
/**
* 查找所有分支行信息
* @return
*/
List<ParentBrach> selectAllBankInfo();
}
二级分行:
package com.smp.orgManage.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.smp.model.BraOffRecBra;
import com.smp.model.allbankinfo.Brach;
/**
* <p>二级分行mapper接口</p>
*
* @author gaozhenghong
* @date 2018年3月6日
*
*/
public interface OnlineBraOffRecBraMapperExt {
/**
* 根据ID查询二级分行
* @param parentBraId
* @return
*/
List<Brach> selectRecBrasByParentId(@Param("parentBraId") String parentBraId);
}
支行信息:
package com.smp.orgManage.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.smp.model.BraOffRecSubBra;
import com.smp.model.allbankinfo.SubBrach;
/**
* <p>支行mapper接口</p>
*
* @author gaozhenghong
* @date 2018年3月6日
*
*/
public interface OnlineBraOffRecSubBraMapperExt {
/**
* 根据ID查询分支行
* @param branchId
* @return
*/
List<SubBrach> selectSubBrasByBranchId(@Param("branchId") String branchId);
}
mapper层:
一级分行:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "htp://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
namespace="com.smp.orgManage.mapper.OnlineBraOffRecParentBraMapperExt">
<resultMap id="allBankInfo" type="com.smp.model.allbankinfo.ParentBrach">
<id column="PARENT_BRANCH_ID" property="parentBrachId" jdbcType="VARCHAR" />
<result column="PARENT_BRANCH_NAME" property="parentBrachname"
jdbcType="VARCHAR" />
<collection property="brachList" column="PARENT_BRANCH_ID"
select="com.smp.orgManage.mapper.OnlineBraOffRecBraMapperExt.selectRecBrasByParentId">
</collection>
</resultMap>
<select id="selectAllBankInfo" resultMap="allBankInfo">
SELECT
A.ID
PARENT_BRANCH_ID,
A.PARENT_BRANCH_NAME
FROM
ONLINE_BRA_OFF_REC_PARENT_BRA A
</select>
</mapper>
二级分行:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "htp://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.smp.orgManage.mapper.OnlineBraOffRecBraMapperExt">
<resultMap id="brach" type="com.smp.model.allbankinfo.Brach">
<id column="BRANCH_ID" property="branchId" jdbcType="VARCHAR" />
<result column="BRANCH_NAME" property="branchName" jdbcType="VARCHAR" />
<result column="PARENT_BRANCH_ID" property="parentBranchId"
jdbcType="VARCHAR" />
<collection property="subBrachList" column="BRANCH_ID"
select="com.smp.orgManage.mapper.OnlineBraOffRecSubBraMapperExt.selectSubBrasByBranchId"></collection>
</resultMap>
<select id="selectRecBrasByParentId" parameterType="java.lang.String"
resultMap="brach">
SELECT
T.ID BRANCH_ID,
T.BRANCH_NAME ,
T.PARENT_BRANCH_ID
FROM
ONLINE_BRA_OFF_REC_BRA T
WHERE PARENT_BRANCH_ID = #{parentBraId}
</select>
</mapper>
支行信息:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "htp://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.smp.orgManage.mapper.OnlineBraOffRecSubBraMapperExt">
<resultMap id="subBrach" type="com.smp.model.allbankinfo.SubBrach">
<id column="ID" property="subBranchId" jdbcType="VARCHAR" />
<result column="SUB_BRANCH_NAME" property="subBranchName" jdbcType="VARCHAR" />
<result column="SUB_BRANCH_ORG_CODE" property="subBranchCode" jdbcType="VARCHAR" />
<result column="BRANCH_ID" property="branchId" jdbcType="VARCHAR" />
</resultMap>
<!-- 根据ID查询分支行 -->
<select id="selectSubBrasByBranchId" parameterType="java.lang.String"
resultMap="subBrach">
SELECT
ID ,
SUB_BRANCH_ORG_CODE,
SUB_BRANCH_NAME,
BRANCH_ID
FROM
ONLINE_BRA_OFF_REC_SUB_BRA
WHERE BRANCH_ID = #{branchId}
</select>
</mapper>
总结:使用collection来映射一对多的关系,使用其中的select属性对应另一个list的查询。