MyBatis-04-mybatis 多表查询

 构建实体类

多表查询时,首先确认表与表之间的关系,一个老师可以教多个学生,一个学生可以有多个老师,但一个学生只会有一个班级。表与表之间的关系是一对多 还是 多对一

我这边是建了学生表和班级表的实体类

 

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>

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值