(5)MyBatis之一对多关联

1.引言

      在本篇博客中主要介绍:

  • MyBatis中一对多关联如何建立,一对多关联映射文件如何写?在一对多关联中实体类应该如何建立?

2.MyBatis之一对多关联

      在涉及到代码之前,我们先说一下数据库中的表结构:

  • 数据库中有两个表:student表(学生表),classes表(班级表),student表和classes表是一对多的关系:一个班级里面有很多的学生
  • 我们的需求是,根据班级号查询该班级的学生
classes表:cid班级号,cname班级名称,dec班级的描述
student表:sid学生号,sname学生名称,hobit爱好,cid外键,记录属于哪一个班级

2.1 创建我们的数据库

DROP DATABASE IF EXISTS school;
CREATE DATABASE IF NOT EXISTS school;
USE school;
CREATE TABLE `classes`(
`cid` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`cname` VARCHAR(32) ,
`dec` VARCHAR(20)
);
CREATE TABLE `student`(
`sid` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`sname` VARCHAR(32) ,
`hobit` VARCHAR(20),
`cid` INT(11),
CONSTRAINT FOREIGN KEY(cid) REFERENCES classes(cid)
ON DELETE CASCADE
);
INSERT INTO `classes` (`cid`,`cname`,`dec`)
VALUES(1,"C++","C++班级");
INSERT INTO `classes` (`cid`,`cname`,`dec`)
VALUES(2,"C#","C#班级");
INSERT INTO `classes` (`cid`,`cname`,`dec`)
VALUES(3,"Java","Java班级");
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(1,"aaa","喜欢玩游戏",1);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(2,"bbb","喜欢学习",1);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(3,"ccc","喜欢打篮球",2);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(4,"ddd","喜欢打排球",2);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(5,"eee","喜欢打篮球",3);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(6,"fff","喜欢玩游戏",3);

2.2 创建Student持久化类

package com;

public class Student {
    private Integer sid;

    private String sname;

    private String hobit;

    private Integer cid;

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname == null ? null : sname.trim();
    }

    public String getHobit() {
        return hobit;
    }

    public void setHobit(String hobit) {
        this.hobit = hobit == null ? null : hobit.trim();
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }
}

2.3 创建Classes持久化类(建立一对多关系)

package com;
import java.util.List;
public class Classes {
    private Integer cid;
    private String cname;
    private String dec;
    //一个班级有很多的学生
    private List<Student> students;
    public Integer getCid() {
        return cid;
    }
    public void setCid(Integer cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname == null ? null : cname.trim();
    }
    public String getDec() {
        return dec;
    }
    public void setDec(String dec) {
        this.dec = dec == null ? null : dec.trim();
    }
    public List<Student> getStudents() {
        return students;
    }
    public void setStudents(List<Student> students) {
        this.students = students;
    }
}

2.4 根据需求编写映射文件

  • 我们的需求是:根据班级号查询班级的学生,因此我们开始写相应的映射文件

  • 编写Student映射

<resultMap id="StudentMap" type="com.Student" >
    <id column="sid" property="sid" jdbcType="INTEGER" />
    <result column="sname" property="sname" jdbcType="VARCHAR" />
    <result column="hobit" property="hobit" jdbcType="VARCHAR" />
    <result column="cid" property="cid" jdbcType="INTEGER" />
</resultMap>
  • 编写Classes映射(通过collection映射关系)
<resultMap id="ClassesMap" type="com.Classes" >
    <id column="cid" property="cid" jdbcType="INTEGER" />
    <result column="cname" property="cname" jdbcType="VARCHAR" />
    <result column="dec" property="dec" jdbcType="VARCHAR" />
    <collection property="students" resultMap="StudentMap">
    </collection>
</resultMap>

2.5 编写SQL语句

  • 通过班级的cid查询该班级的信息(同时查询出该班级的学生)
<select id="findById" resultMap="ClassesMap" parameterType="int">
    select * from classes  c join student s on s.cid=c.cid where c.cid=#{id}
</select>

2.6 编写测试类

    @Test
    public void testOneToMany()
    {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        try{
            Classes classes=sqlSession.selectOne("com.ClassesMapper.findById", 1);
            System.out.print(classes);
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally{
            sqlSession.commit();
        }
        MyBatisUtil.closeSqlSession();
    }

2.7 测试结果

这里写图片描述

3. 代码下载

本博客的代码下载地址为:MyBatis之一对多关联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值