MyBatis在映射文件中加载关联对象的关系主要通过两种方式:查询嵌套、结果嵌套
查询嵌套:类似于子查询,它需要执行多条sql语句
结果嵌套:类似于联结查询,它只会执行一条复杂的sql语句
一、多对一查询
例如:会员和门店,一个商户的一个门店下可以有多个会员,每个会员对应一个门店
实例类pojo:
TdyMemberInfo.class
package com.sc.pojo;
import lombok.Data;
@Data
public class TdyMemberInfo {
private Long id;
private String memberNo;
private String mobile;
private String openId;
private TdyShop shop;
}
TdyShop.class
package com.sc.pojo;
import lombok.Data;
@Data
public class TdyShop {
private int shopInfoId;
private String shopName;
private Long shopId;
}
数据库中表字段与实体类的属性对应,t_dy_member_info表通过外键shop_id关联t_dy_shop表
TdyMemberInfoMapper.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.sc.dao.TdyMemberInfoMapper">
<select id="getAllmemberInfo1" resultMap="memberShop">
select m.member_id id, m.member_no memberNo,m.mobile,m.open_id openId,m.shop_id shopId from t_dy_member_info m
where m.member_no is not null and m.shop_id is not null
</select>
<resultMap id="memberShop" type="TdyMemberInfo">
<result property="id" column="id"/>
<result property="memberNo" column="memberNo"/>
<result property="openId" column="openId"/>
<association property="shop" column="shop_id" javaType="TdyShop" select="getShop">
<result property="shopInfoId" column="shop_info_id"/>
<result property="shopId" column="shop_id"/>
<result property="shopName" column="shopName"/>
</association>
</resultMap>
<select id="getShop" resultType="TdyShop">
select * shopName from t_dy_shop where shop_id=#{shopId}
</select>
结果嵌套(多对一)
<resultMap id="memberResultMap" type="TdyMemberInfo">
<result property="id" column="member_id"/>
<result property="memberNo" column="member_no"/>
<result property="mobile" column="mobile"/>
<result property="openId" column="open_id"/>
<!--关联对象property 关联对象在TdyShop实体类中的属性 association: 一对一关联(has one)-->
<association property="shop" javaType="TdyShop">
<result property="shopInfoId" column="shop_info_id"/>
<result property="shopId" column="shop_id"/>
<result property="shopName" column="shop_name"/>
</association>
</resultMap>
<select id="getAllmemberInfo2" resultMap="memberResultMap" >
select m.*,s.*
from t_dy_member_info m ,t_dy_shop s
where m.shop_id = s.shop_id and m.member_no is not null
</select>
接口:TdyMemberInfoDao.class
package com.sc.dao;
import com.sc.pojo.TdyMemberInfo;
import java.util.List;
public interface TdyMemberInfoDao {
//多对一
List<TdyMemberInfo> getAllmemberInfo1();
List<TdyMemberInfo> getAllmemberInfo2();
}
测试类:MemberDaoTest.class
package com.sc.dao;
import com.sc.config.MyBatisUtils;
import com.sc.pojo.TdyMemberInfo;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MemberDaoTest {
//多对一
@Test
public void selectAll1(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TdyMemberInfoDao mapper = sqlSession.getMapper(TdyMemberInfoDao.class);
List<TdyMemberInfo> allMembers = mapper.getAllmemberInfo1();
for(TdyMemberInfo member:allMembers){
System.out.println(member);
}
sqlSession.close();
}
//多对一
@Test
public void selectAll2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TdyMemberInfoDao mapper = sqlSession.getMapper(TdyMemberInfoDao.class);
List<TdyMemberInfo> allMembers = mapper.getAllmemberInfo2();
for(TdyMemberInfo member:allMembers){
System.out.println(member);
}
sqlSession.close();
}
输出结果:
![](https://img.haomeiwen.com/i1955673/e886ce74a239208e.png)
![](https://img.haomeiwen.com/i1955673/503c30c921189676.png)
二、一对多查询
例如:会员和门店,多个会员属于同一个门店
实例类pojo:
TdyMemberInfo.class
package com.sc.pojo;
import lombok.Data;
@Data
public class TdyMemberInfo {
private Long memberId;
private String memberNo;
private String mobile;
private String openId;
private String shopId;
}
TdyShop.class
package com.sc.pojo;
import lombok.Data;
import java.util.List;
@Data
public class TdyShop {
private Long shopId;
private String shopCode;
private String shopName;
private List<TdyMemberInfo> memberList;
}
mapper配置文件
TdyShopMapper.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.sc.dao.TdyShopMapper">
<select id="getShopMembers2" resultMap="shopResultMap">
select * from t_dy_shop where shop_id=#{shopId}
</select>
<resultMap id="shopResultMap" type="TdyShop">
<collection property="memberList" javaType="ArrayList" ofType="TdyMemberInfo" column="shop_id" select="getMembers"/>
</resultMap>
<select id="getMembers" resultType="TdyMemberInfo">
select *
from t_dy_member_info
where member_no is not null
and shop_id=#{shopId}
</select>
</mapper>
结果嵌套(一对多)
<resultMap id="memberMap" type="TdyShop">
<result property="shopId" column="shop_id"/>
<result property="shopCode" column="shop_code"/>
<result property="shopName" column="shop_name"/>
<!--关联对象property 关联对象在TdyShop实体类中的属性-->
<!--
collection定义关联的集合类型的属性的封装规则,一对多关联(has many)
property="memberList":指定这是哪个集合属性,对应实例类中对应的属性 private List<TdyMemberInfo> memberList; 中的memberList
ofType:指定集合内封装的JavaBean类型(集合内装的什么),这里是会员信息,即为TdyMemberInfo类
-->
<collection property="memberList" ofType="TdyMemberInfo" column="shop_id">
<result property="memberId" column="member_id"/>
<result property="memberNo" column="member_no"/>
<result property="mobile" column="mobile"/>
<result property="openId" column="open_id"/>
<result property="shopId" column="shop_id"/>
</collection>
</resultMap>
<select id="getShopMembers" resultMap="memberMap" >
select s.*,m.*
from t_dy_shop s,t_dy_member_info m
where s.shop_id = m.shop_id
and m.member_no is not null
and s.shop_id = #{shopId}
</select>
接口:TdyShopMapper.class
package com.sc.dao;
import com.sc.pojo.TdyShop;
import org.apache.ibatis.annotations.Param;
public interface TdyShopMapper {
//一对多
TdyShop getShopMembers(@Param("shopId") Long shopId);
TdyShop getShopMembers2(@Param("shopId") Long shopId);
}
测试类:MemberDaoTest.class
package com.sc.dao;
import com.sc.config.MyBatisUtils;
import com.sc.pojo.TdyMemberInfo;
import com.sc.pojo.TdyShop;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MemberDaoTest {
//一对多
@Test
public void getShopMembers(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TdyShopMapper mapper = sqlSession.getMapper(TdyShopMapper.class);
TdyShop shop = mapper.getShopMembers(new Long(4463798));
System.out.println(shop);
List<TdyMemberInfo> memberList = shop.getMemberList();
for(TdyMemberInfo memberInfo:memberList){
System.out.println(memberInfo);
}
sqlSession.close();
}
//一对多
@Test
public void getShopMembers2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TdyShopMapper mapper = sqlSession.getMapper(TdyShopMapper.class);
TdyShop shop = mapper.getShopMembers2(new Long(4463798));
System.out.println(shop);
List<TdyMemberInfo> memberList = shop.getMemberList();
for(TdyMemberInfo memberInfo:memberList){
System.out.println(memberInfo);
}
sqlSession.close();
}
}
输出结果:
![](https://img.haomeiwen.com/i1955673/09570d302e5db24a.png)
![](https://img.haomeiwen.com/i1955673/663cac8618dcc940.png)
网友评论