zoukankan      html  css  js  c++  java
  • Mybatis级联

    在客观世界中,对象很少是孤独存在的,如班级与学生之间的关系,它们的实例之间可以互相访问,这就是关联关系。那么映射到数据库中就是表与表之间的关联关系(级联),数据库中表常见的关联关系一般有三种:
    1、一对一:一个班主任只属于一个班级,一个班级也只能有一个班主任
    2、一对多:一个班级有多个学生,一个学生只属于一个班级
    3、多对多:一个学生可以选多门课,一门课可以有多个学生选
    一般来说使用级联可以帮我们十分便捷的获取数据,但是级联并不是必须的,过多的级联会增加系统的复杂度,降低系统的性能,所以当级联超过3层时,就不要考虑使用级联了,这样会导致多个对象的关联,使得系统的耦合性增高,变的复杂难以维护。在实际开发中我们需要根据实际情况来考虑是否使用级联。

    在Mybatis中关联关系也是分为为三种:一对一关系,一对多关系,以及鉴别器(根据某些条件来决定采用具体级联的方案,可以自行了解)。需要注意的是在Mybatis中并没有多对多的关联关系,因为多对多的关系太过复杂了,使用起来比较困难,我们可以使用两个一对多来进行替换,所以Mybatis不再支持多对多的关联关系。

    这里我们分别先创建 班主任,班级 和 学生这三张表:
    班主任表 :

    CREATE TABLE head_teacher( 
    teacher_id INT(11) PRIMARY KEY, 
    teacher_name VARCHAR(20), 
    age INT(3) 
    );

    班级表:

    CREATE TABLE class(
    class_id INT(11) PRIMARY KEY, 
    class_name VARCHAR(20), 
    teacher_id INT(11) 
    );

    学生表:

    CREATE TABLE student(
    student_id INT(11) PRIMARY KEY, 
    student_name VARCHAR(20), 
    gender VARCHAR(3), 
    age INT(3), 
    class_id INT(11) 
    );


    一对一关系处理:
    Mybatis给出关联关系的解决方案就是resultMap:

     

    <resultMap id="classInfo" type="entity.TClass">
    <id property="classId" column="class_id"/>
    <result property="className" column="class_name"/>
    <!-- association 元素实现一对一级联, property="teacher" 指定TClass类中相应的字段名, javaType 指定类型 -->
    <association property="teacher" javaType="entity.HeadTeacher">
    <id property="teacherId" column="teacher_id" />
    <result property="name" column="teacher_name" />
    <result property="age" column="age" />
    </association>
    </resultMap>

    然后返回类型使用ResultMap即可:

    <select id="getClassById" parameterType="Integer" resultMap ="classInfo">
    SELECT c.*,t.* FROM t_class c , head_teacher t
    WHERE c.teacher_id=t.teacher_id AND c.class_id=#{id}
    </select>

    如果想要提高复用性,也可以将Teacher类型单独封装到resultMap 中,然后在association标签中通过 resultMap 属性引入即可:

    <association property="teacher" resultMap="headTeacherInfo"/>


    一对多关系处理:
    MyBatis 一对多关联关系:比如一个班级可以对应多个学生,现有需求根据班级的id查出当前班级信息和该班级的所有学生

     

    <resultMap id="classInfo2" type="entity.TClass1">
    <id property="classId" column="class_id"/>
    <result property="className" column="class_name"/>
    <!-- 一对多关联映射:collection -->
    <collection property="students" ofType="entity.Student">
    <id property="studentId" column="student_id" />
    <result property="studentName" column="student_name" />
    <result property="gender" column="gender" />
    <result property="age" column="age" />
    </collection>
    </resultMap>
    <select id="findTClass1ById" parameterType="Integer" resultMap="classInfo2">
    SELECT c.*,s.* FROM t_class c , student s
    WHERE c.class_id=s.class_id AND c.class_id=#{id}
    </select>

    多对多关系处理:
    引入中间表,将其转化成两个一对多处理。

  • 相关阅读:
    几个.net开源项目(转)
    UILabel显示换行的方法
    使用TDBXReader或TDataSet回传数据,中文乱码问题解决办法
    NSDateFormatter setDateFormat 自定义日期时间格式
    iPhone开发之打包zip文件
    创建log文件的代码
    去除iphone图标的半弧高亮效果
    Ajax XMLHttpRequest对象open方法的参数 为什么要把时间戳追加到目标URL?
    时间校验
    WPF视频
  • 原文地址:https://www.cnblogs.com/ericz2j/p/11109148.html
Copyright © 2011-2022 走看看