11、MyBatis 实战 - 之MyBatis多对一映射查询

一、场景描述

有两张表:

学生表 t_stu 和  班级表 t_clazz,学生表的cid和班级表的cid关联,
表示一个班级有多个学生

 
以学生表 t_stu为主表,即“多”,以班级表t_clazz为副表,即“一”,我们下面通过mybatis高级映射实现多对一的情况

二、实现多对一查询的三种方式

准备工作

两个类

学生类 Stu :多对一,学生表为主表,Stu类里面需要加上班级属性
public class Stu {
    private Integer sid;
    private String name;
    private Clazz clazz;
    ......
}
班级类 Clazz 
public class Clazz {
    private Integer cid;
    private String name;
......
}

方式一、级联属性映射查询

StuMapper 接口
public interface StuMapper {
    public Stu selectBySid(Integer sid);
}
StuMapper.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.powernode.mybatis.mapper.StuMapper">
    <!--方式一:级联映射-->
    <resultMap id="stuMap" type="Stu">
        <id property="sid" column="sid"/>
        <result property="name" column="name"/>
        <result property="clazz.cid" column="cid"/>
        <result property="clazz.name" column="name"/>
    </resultMap>
    <select id="selectBySid" resultMap="stuMap">
        select s.sid,s.name,c.cid,c.name from t_stu s left join t_clazz c on s.cid = c.cid
        where s.sid ={sid}
    </select>
</mapper>
测试类跑一下
	@Test
    public void testAdvanceMapping(){
        SqlSession sqlSession = SqlSessionUtil.openSqlSession();
        StuMapper mapper = sqlSession.getMapper(StuMapper.class);
        Stu stu = mapper.selectBySid(1);
        System.out.println(stu.toString());
    }
运行结果
11:23:30.891 default [main] DEBUG c.p.m.mapper.StuMapper.selectBySid - ==>  Preparing: select s.sid,s.name,c.cid,c.name from t_stu s left join t_clazz c on s.cid = c.cid where s.sid = ?
11:23:30.982 default [main] DEBUG c.p.m.mapper.StuMapper.selectBySid - ==> Parameters: 1(Integer)
11:23:31.050 default [main] DEBUG c.p.m.mapper.StuMapper.selectBySid - <==      Total: 1
Stu{
     sid=1, name='张三', clazz=Clazz{
     cid=1000, name='张三'}}

方式二、使用association属性 进行关联查询

StuMapper 接口
public interface StuMapper {
    public Stu selectAssociationBySid(Integer sid);
}
StuMapper.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.powernode.mybatis.mapper.StuMapper">
    <resultMap id="stuAssociationMap" type="Stu">
        <id property="sid" column="sid"/>
        <result property="name" column="name"/>
        <association property="clazz" javaType="Clazz">
            <id property="cid" column="cid"/>
            <result property="name" column="name"/>
        </association>
    </resultMap>
    <select id="selectAssociationBySid" resultMap="stuAssociationMap">
        select s.sid,s.name,c.cid,c.name 
        from t_stu s 
        left join t_clazz c 
        on s.cid = c.cid
        where s.sid ={sid}
    </select>
</mapper>
测试类跑一下
	@Test
    public void testAdvanceMappingAssociation(){
        SqlSession sqlSession = SqlSessionUtil.openSqlSession();
        StuMapper mapper = sqlSession.getMapper(StuMapper.class);
        Stu stu = mapper.selectAssociationBySid(1);
        System.out.println(stu.toString());
    }
运行结果
11:26:38.082 default [main] DEBUG c.p.m.m.S.selectAssociationBySid - ==>  Preparing: select s.sid,s.name,c.cid,c.name from t_stu s left join t_clazz c on s.cid = c.cid where s.sid = ?
11:26:38.128 default [main] DEBUG c.p.m.m.S.selectAssociationBySid - ==> Parameters: 1(Integer)
11:26:38.171 default [main] DEBUG c.p.m.m.S.selectAssociationBySid - <==      Total: 1
Stu{
     sid=1, name='张三', clazz=Clazz{
     cid=1000, name='张三'}}

方式三、分步查询

StuMapper 接口
public interface StuMapper {
    public Stu selectBySidStep1(Integer sid);
}
ClazzMapper接口
public interface ClazzMapper {
    public Clazz selectByCidStep2(Integer cid);
}
StuMapper.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.powernode.mybatis.mapper.StuMapper">
    <!--分步骤查询-->
    <resultMap id="selectBySidStepMap" type="Stu">
        <id property="sid" column="sid"/>
        <result property="name" column="name"/>
        <association property="clazz"
                     select="com.powernode.mybatis.mapper.ClazzMapper.selectByCidStep2"
                     column="cid"
        />
    </resultMap>
    <select id="selectBySidStep1" resultMap="selectBySidStepMap">
        select s.sid,s.name,s.cid from t_stu s
        where s.sid ={sid}
    </select>
</mapper>
ClazzMapper.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.powernode.mybatis.mapper.ClazzMapper">
    <select id="selectByCidStep2" resultType="Clazz">
        select * from t_clazz where cid ={cid}
    </select>
</mapper>
测试类跑一下
	@Test
    public void testAdvanceMappingStep(){
        SqlSession sqlSession = SqlSessionUtil.openSqlSession();
        StuMapper mapper = sqlSession.getMapper(StuMapper.class);
        Stu stu = mapper.selectBySidStep1(1);
        System.out.println(stu.getName());
        System.out.println(stu.getClazz());
    }
运行结果
11:33:51.221 default [main] DEBUG c.p.m.m.StuMapper.selectBySidStep1 - ==>  Preparing: select s.sid,s.name,s.cid from t_stu s where s.sid = ?
11:33:51.294 default [main] DEBUG c.p.m.m.StuMapper.selectBySidStep1 - ==> Parameters: 1(Integer)
11:33:51.419 default [main] DEBUG c.p.m.m.StuMapper.selectBySidStep1 - <==      Total: 1
11:33:51.426 default [main] DEBUG c.p.m.m.ClazzMapper.selectByCidStep2 - ==>  Preparing: select * from t_clazz where cid = ?
11:33:51.426 default [main] DEBUG c.p.m.m.ClazzMapper.selectByCidStep2 - ==> Parameters: 1000(Integer)
11:33:51.441 default [main] DEBUG c.p.m.m.ClazzMapper.selectByCidStep2 - <==      Total: 1
Stu{
     sid=1, name='张三', clazz=Clazz{
     cid=1000, name='高三一班'}}