mybatis中collection的使用(三级联动)

97 篇文章 3 订阅
39 篇文章 0 订阅

mybatis中association和collection的column传入多个参数值

项目中在使用association和collection实现一对一和一对多关系时需要对关系中结果集进行筛选,如果使用懒加载模式,即联合使用select标签时,主sql和关系映射里的sql是分开的,查询参数传递成为问题。

mybatis文档:

propertydescription
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的查询。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis自连接三级联动和resultMap三级映射是一种常见的数据查询和映射方式。下面我来解释一下。 首先,自连接三级联动是指在数据库,存在一个表,其的某些字段关联到该表的自身字段。通常情况下,我们需要使用连续的JOIN语句来实现多级联动查询。在MyBatis,可以使用XML配置文件或注解来定义SQL语句,然后使用resultMap进行结果的映射。 在XML配置文件,可以使用<resultMap>元素来定义映射关系。对于自连接的情况,可以使用嵌套的<association>或<collection>元素来表示关联关系。例如: ```xml <resultMap id="userMap" type="User"> <id property="id" column="id" /> <result property="name" column="name" /> <association property="manager" javaType="User"> <id property="id" column="manager_id" /> <result property="name" column="manager_name" /> <collection property="subordinates" ofType="User"> <id property="id" column="subordinate_id" /> <result property="name" column="subordinate_name" /> ... </collection> </association> </resultMap> ``` 上述代码,定义了一个名为userMap的resultMap,映射了User对象及其关联的manager和subordinates字段。 在实际查询时,可以使用嵌套的SELECT语句或连续的JOIN语句来实现自连接的多级联动查询。例如: ```xml <select id="getUserWithManagerAndSubordinates" resultMap="userMap"> SELECT u.id, u.name, m.id AS manager_id, m.name AS manager_name, s.id AS subordinate_id, s.name AS subordinate_name FROM user u LEFT JOIN user m ON u.manager_id = m.id LEFT JOIN user s ON u.id = s.manager_id WHERE u.id = #{id} </select> ``` 上述代码使用了连续的LEFT JOIN语句来查询用户及其关联的上级经理和下级员工信息。 通过以上的配置和查询,就可以实现MyBatis的自连接三级联动和resultMap三级映射。希望能对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值