学过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());
}
}
至于配置文件的解释,我就不废话了,相信大家一看就懂。
如有问题,请留言交流。