Mybatis(ibatis)的一对多关联配置

学过hibernate的同学都知道了,如何配置实体类之间存在着(双)(单)一对多的关系,今天让我们来了解一下。

Mybatis是如何配置这种关系的!

测试的数据库

drop table t_10_01_student;
drop table t_10_01_class;
drop table t_10_01_grade;
create table t_10_01_grade(
  id varchar2(32) default sys_guid() primary key ,
  gname varchar2(50) not null
);

create table t_10_01_class(
  id varchar2(32) default sys_guid() primary key ,
  cname varchar2(50) not null,
  gid varchar2(32),
  foreign key (gid) references t_10_01_grade(id)
);

create table t_10_01_student(
  id varchar2(32) default sys_guid() primary key ,
  sname varchar2(50) not null,
  sage number(2) not null,
  cid varchar2(32) references t_10_01_class(id)
);
select * from t_10_01_grade;
select * from t_10_01_class;
select * from t_10_01_student;
/

从以上数据表结构,我们很容易看出,这是个常见的年级-班级-学生结构表。年级与班级,班级与学生 都是一对多的关系。

题目:

请查询所有班级的信息(包含这个班级的年级名称。这个班级的学生个数)
示例图如下:

这里写图片描述

此时我们如何配置 班级与年级的一对一。班级与学生的一对多呢?

实现配置文件如下:

<?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="dao.ClassesMapper">

    <!-- 学生方配置 -->
    <resultMap id="StudentMap" type="student">
        <id column="id" property="id" jdbcType="VARCHAR" />
        <result column="sname" property="sname" jdbcType="VARCHAR" />
        <result column="age" property="age" jdbcType="INTEGER" />
    </resultMap>

    <!-- 班级方配置 -->
    <resultMap id="ClassMap" type="classes">
        <id column="classid" property="id" jdbcType="VARCHAR" />
        <result column="CNAME" property="cname" jdbcType="VARCHAR" />
        <association property="gid"  resultMap="GradeMap" />
        <collection property="students"  resultMap="StudentMap" />
    </resultMap>
    <!-- 年级方配置 -->
    <resultMap id="GradeMap" type="grade">
        <id column="gid" property="id" jdbcType="VARCHAR" />
        <result column="gname" property="gname" jdbcType="VARCHAR" />
    </resultMap>


    <!-- 查询所有 -->
    <select id="selectAll" resultMap="ClassMap" >
        select c.ID classid, c.cname,s.sname,s.cid ,s.id,g.id gid,g.gname from
    SCOTT.T_10_01_CLASS c,SCOTT.T_10_01_Student s,SCOTT.T_10_01_Grade g
    where c.id=s.cid and c.gid=g.id   order by c.cname asc
    </select>


</mapper>

接口方法:

package dao;

import java.util.List;

import vo.Classes;

public interface ClassesMapper {



    List<Classes> selectAll();
}

测试结果:

// 查询(查询每一个班级有多少学生。附带年级名称。)
    @Test
    public void test_select_students_By_classPrimaryKey() {
        List<Classes> result = classbiz.find_classes();
        System.out.println("年级名称\t班级名称\t班级人数");
        for (Classes classes : result) {
            System.out.println(classes.getGid().getGname() + "\t"
                    + classes.getCname() + "\t" + classes.getStudents().size());
        }
    }

至于配置文件的解释,我就不废话了,相信大家一看就懂。

如有问题,请留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一缕阳光直射你的心扉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值