构建实体类
多表查询时,首先确认表与表之间的关系,一个老师可以教多个学生,一个学生可以有多个老师,但一个学生只会有一个班级。表与表之间的关系是一对多 还是 多对一
我这边是建了学生表和班级表的实体类
Mybatis 配置多对一的关系
在多对一的时候 我们需要在多的一方的类里面引入一的类(作为一个属性而存在)
像这里学生是作为多的那一方
加入 private TabClass tabClass; 然后多对一配置完成
编写Mapper文件
<!-- autoMapping = true 当列名和属性名一致的时候 自动映射-->
<resultMap id="getStu" type="org.example.entity.TabStudent">
<!-- 列名和属性 一一对应-->
<!-- 注意 主键 stuno 标签id 代表主键-->
<!-- cloumn 代表的是列的名字-->
<!-- property 实体类中的属性名-->
<id column="stuno" property="stuno"></id>
<!-- 普通的字段-->
<result column="stuname" property="stuname"></result>
<result column="stusex" property="stusex"></result>
<result column="classid" property="classid"></result>
<!-- 多对一 标签 property 代表在多的一方的属性的名字-->
<!-- javaType 代表属性的类型是什么-->
<association property="tabClass" javaType="org.example.entity.TabClass">
<!-- 配置-->
<id property="id" column="id"></id>
<result property="cname" column="cname"></result>
</association>
</resultMap>
<!-- 查询的数据的列名和实体类中的属性名不一致的时候使用的是resultMap-->
<!-- resultMap = “自己定义的resultMap标签的id”-->
<select id="findAll" resultType="org.example.entity.TabStudent">
select * from tab_student s
left join tab_class c
ON s.classid=c.id
</select>
dao接口
//所有的学生 以及学生的班级信息
List<TabStudent> findAll();
Test 实体类
@Test
public void query(){
List<TabStudent> all = mapper.findAll();
System.out.println(all);
}
注意别忘了编写MyBatis文件里的<mapper>
一对多的关系
查询所有的班级 以及班级里的所有学生
加入配置
一对多的时候 一配置多 多的对象需要使用集合(list set)封装起来
编写Mapper文件
<resultMap id="getAllClass" type="org.example.entity.TabClass" autoMapping="true">
<id column="id" property="id"></id>
</resultMap>
<select id="findAll" resultMap="getAllClass">
select * from tab_class c
left join tab_student s
ON s.classid=c.id
</select>
dao接口
public interface IClassMapper {
List<TabClass> findAll();
}
Test 实体类
@Test
public void query(){
List<TabClass> all = mapper.findAll();
//三个班级
//【{id=1},cname=A369,[{},{}]】
System.out.println(all.size());
System.out.println(all);
}
拓展 ResultMap
ResultMap元素 主要用于如: 属性名和列名不一致,为一些连接的复杂语句编写映射代码使用,ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
ResultMap 的属性:
id:当前命名空间中的一个唯一标识,用于标识一个结果映射。
type:类的完全限定名, 或者一个类型别名。
id和result
id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段;
id 主键的标签
result 普通的列的标签
代码:
<resultMap id="getStu" type="org.example.entity.TabStudent">
<!-- 列名和属性 一一对应-->
<!-- 注意 主键 stuno 标签id 代表主键-->
<!-- cloumn 代表的是列的名字-->
<!-- property 实体类中的属性名-->
<id column="stuno" property="stuno"></id>
<!-- 普通的字段-->
<result column="stuname" property="stuname"></result>
<result column="stusex" property="stusex"></result>
<result column="classid" property="classid"></result>
<!-- 多对一 标签 property 代表在多的一方的属性的名字-->
<!-- javaType 代表属性的类型是什么-->
<association property="tabClass" javaType="org.example.entity.TabClass">
<!-- 配置-->
<id property="id" column="id"></id>
<result property="cname" column="cname"></result>
</association>
</resultMap>