mybatis级联之一对多的关系

一对多的级联
mybatis一对多的级联,这里举例班级和学生的例子,一个班级有多个学生,属于一对多的关系,一个学生只属于一个班级,属于多对一的关系。
建立数据库文件

CREATE TABLE f_class(
c_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 's_id',
CODE VARCHAR(20) NOT NULL COMMENT '编号',
NAME VARCHAR(20) NOT NULL COMMENT '名称'
);
INSERT INTO f_class(CODE,NAME) VALUES ('1401','Software Engineering');

CREATE TABLE f_student(
s_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 's_id',
s_NAME VARCHAR(20) NOT NULL COMMENT '名字',
sex VARCHAR(20) NOT NULL COMMENT '性别',
age INT NOT NULL COMMENT '年龄',
class_id INT,
FOREIGN KEY (class_id) REFERENCES f_class(id)
);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('lazy','boy',20,1);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('rose','girl',19,1);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('joh','boy',19,1);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('miss','girl',20,1);

建立POJO对象,都省略类 set和get方法。
Grade.java

public class Grade implements Serializable{
    private Integer c_id;
    private String code;
    private String name;
    //班级和学生一对多的关系,一个班级可以有多个学生
    private List<Student> students;
  } 

Student.java

public class Student implements Serializable {
    private Integer s_id;
    private String s_name;
    private String sex;
    private Integer age;
}

映射文件GradeMapper.xml

<mapper namespace="com.stumybatis.dao.GradeDao">
    <select id="selectGradeById" parameterType="int" resultMap="gradeStudent">
        SELECT * from f_class c,f_student s  where c.c_id=#{c_id} and s.class_id=c.c_id
    </select>
    <resultMap id="gradeStudent" type="com.stumybatis.pojo.Grade">
        <id property="c_id" column="c_id"/>
        <result property="code" column="code"/>
        <result property="name" column="name"/>
        <!--collection表示一对多的关系-->
        <collection property="students" ofType="com.stumybatis.pojo.Student" >
            <id property="s_id" column="s_id"/>
            <result property="s_name" column="s_name"/>
            <result property="sex" column="sex"/>
            <result property="age" column="age"/>
        </collection>
    </resultMap>
</mapper>

GradeDao接口的内容

public interface GradeDao {

    public Grade selectGradeById(Integer c_id);
}

测试代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-mybatis.xml"})
public class StudentDaoTest {

    @Autowired
    private GradeDao gradeDao;

    @Test
    public void testSelecGrade2() throws Exception{
        Grade grade = gradeDao.selectGradeById(1);
        System.out.println(grade.getC_id()+ " "+grade.getCode()+" "+grade.getName());
        List<Student> list = grade.getStudents();
        for(Student student:list){
            System.out.println(student);
        }
    }

结果如下:
这里写图片描述
但是有一个特别好玩的就是,如果这两个地方的name不区分的话,那就会有很有意思的结果,就是所有的s_name都写成name,会出现下图的结果。把学生的name全都变成了软件工程。很神奇有没有。
这里写图片描述

这里的环境是搭建好的SSM环境测试的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值