一、场景描述
有两张表:
学生表 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='高三一班'}}