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;
/

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

题目:

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

Mybatis(ibatis)的一对多关联配置_第1张图片

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

实现配置文件如下:



<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 selectAll();
}

测试结果:

// 查询(查询每一个班级有多少学生。附带年级名称。)
    @Test
    public void test_select_students_By_classPrimaryKey() {
        List 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());
        }
    }

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

如有问题,请留言交流。

你可能感兴趣的:(mybatis)