Mybatis 一对一,一对多,多对一,多对多的理解

First (一对一)

首先我来说下一对一的理解,就是一个班主任只属于一个班级,一个班级也只能有一个班主任。好吧这就是对于一对一的理解

怎么来实现呢?

这里我介绍了两种方式:

一种是:使用嵌套结果映射来处理重复的联合结果的子集

另一种呢是:通过执行另外一个SQL映射语句来返回预期的复杂类型

<?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,namespace的值习惯上设置成包名+sql映射文件名,这样保证了namespace的值是唯一的-->
<mapper namespace="com.yc.mybatis.test.classMapper">

        <!--
         方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
                 封装联表查询的数据(去除重复的数据)
         select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
     -->

    <select id="getClass" parameterType="int" resultMap="getClassMap">
        select * from class c, teacher t  where c.teacher_id = t.t_id and c.teacher_id=#{id}
    </select>

    <!-- resultMap:映射实体类和字段之间的一一对应的关系 -->
    <resultMap type="Classes" id="getClassMap">
        <id property="id" column="c_id"/>
        <result property="name" column="c_name"/>
        <association property="teacher" javaType="Teacher">
            <id property="id" column="t_id"/>
            <result property="name" column="t_name"/>
        </association>
    </resultMap>

     <!--
         方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
         SELECT * FROM class WHERE c_id=1;
         SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
         property:别名(属性名)    column:列名 -->
          <!-- 把teacher的字段设置进去 -->
    <select id="getClass1" parameterType="int" resultMap="getClassMap1">
        select * from class where c_id=#{id}
    </select>

    <resultMap type="Classes" id="getClassMap1">
        <id property="id" column="c_id"/>
        <result property="name" column="c_name"/>
        <association property="teacher" column="teacher_id" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" parameterType="int" resultType="Teacher">
        select t_id id,t_name name from teacher where t_id =#{id}
    </select>
</mapper>

这里对assacation标签的属性进行解释一下:

property 对象属性的名称
javaType 对象属性的类型
column 所对应的外键字段名称
select 使用另一个查询封装的结果

Second (一对多)and (多对一)

一对多又是怎么样理解呢?

其实也很容易,一个顾客对应多个订单,而一个订单只能对应一个客户

而反过来也就是多对一的形式了

多个订单表可以对应一个顾客,一个顾客是可以拥有多个订单的

其实说到底就是有点类似多个一对一的情况,所以多对一的配置基本和一对一的配置保持一样

一对多的xml配置:

<?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="com.yc.mapper.CustomerMapper"> 

  <resultMap type="com.yc.m.Customer" id="resultCustomerMap">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result property="address" column="address"/>
    <result property="postcode" column="postcode"/>
    <result property="sex" column="sex"/>
    <result property="cname" column="cname"/>
    <collection property="orders" ofType="com.yc.m.Orders">
          <id property="id" column="id"/>
          <result property="code" column="code"/>
    </collection>

  </resultMap> 

  <select id="getCustomer" resultMap="resultCustomerMap" parameterType="int">
    SELECT *
    FROM t_customer
    WHERE id=#{id}
  </select>
</mapper> 

在这里可以明显的看出多出了一个属性ofType,这个ofType的含义就是你collection所对应的是那个bean

当然在bean层中也会发生变化 ,这里在Customer的bean中嵌套一条语句

private List<Orders> orders;   //一个Customer 对应N多个Orders

Third (多对多)

多对多又怎么理解呢?

一个用户可以属于多个集体(家人,朋友,同学),当然一个集体也包含了多个用户

 <strong> <!--collection:聚集    用来处理类似User类中有List<Group> group时要修改group的情况   user代表要修改的是Group中的List<user> --></strong>

<?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="com.yc.bean.Group">
        <!-- resultMap:结合标准javabean规范,能hashmap或arraylist所不能完成的更复杂的resultType -->
        <resultMap type="Group" id="groupMap">
            <id property="id" column="id" />
            <result property="name" column="name" />
            <result property="createTime" column="createdate" />
        </resultMap>  

        <resultMap type="Group" id="groupUserMap" <span style="color:#ff0000;"><strong>extends</strong></span>="groupMap">
            <collection property="user" ofType="User">
            <!--collection:聚集    用来处理类似User类中有List<Group> group时要修改group的情况   user代表要修改的是Group中的List<user> -->
                <id property="id" column="userId" />
                <result property="name" column="userName" />
                <result property="password" column="password" />
                <result property="createTime" column="userCreateTime" />
            </collection>
        </resultMap>  

          <select id="selectAllGroup" resultMap="groupMap">
            select * from group_info
        </select>  

        <!-- 根据Group表中的id或name查询组信息和组内用户信息 -->
        <select id="selectGroupUser" parameterType="Long"
            resultMap="groupUserMap">
            select u.id as userId,u.name as userName,
            u.password,u.createtime as userCreateTime,
            gi.id,gi.name,gi.createdate,gi.state from group_info gi left
            join user_group ug on gi.id=ug.group_id left join user u on
            ug.user_id=u.id  where gi.id = #{id}
        </select>
        <!-- 删除组与组内成员之间的对应关系 -->
        <delete id="deleteGroupUser" parameterType="UserGroupLink">
            delete from user_group
            <where>
                <if test="user.id != 0">user_id = #{user.id}</if>
                <if test="group.id != 0">and group_id = #{group.id}</if>
            </where>
        </delete>
    </mapper>  

这里还需要对user和group这两个bean之间的映射关系进行描述一下:

package com.yc.deom;

import java.util.Date;  

import com.yc.bean.Group;
import com.yc.bean.User;

/**
 * @describe: 描述User和Group之间的映射关系
 */
public class UserGroupLink {  

    private User user;  

    private Group group;  

    private Date createTime;  

    public Date getCreateTime() {
        return createTime;
    }  

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }  

    public Group getGroup() {
        return group;
    }  

    public void setGroup(Group group) {
        this.group = group;
    }  

    public User getUser() {
        return user;
    }  

    public void setUser(User user) {
        this.user = user;
    }
}  

时间: 2024-07-30 13:42:31

Mybatis 一对一,一对多,多对一,多对多的理解的相关文章

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

Mybatis 一对一、一对多、多对一

灵感来源于:https://www.cnblogs.com/xdp-gacl/p/4264440.html 转发自:https://www.cnblogs.com/hq233/p/6752335.html 首先  数据库量表之间字段关系(没有主外键) studentmajor表的id字段对应student表里major字段 两个实体类 package com.model; import java.util.Date; public class Student { private Integer

多对多 一对一 一对多 主从 关联 字典

 "订单"表中的主键.  "产品"表中的主键.  一个订单可以包含多种产品 ...   ... 且每种产品可以出现在多个订单上.   课程文本 在多对多关系中,一个表中的一个记录与第二个表中的多个记录相关,第二个表中的一个记录与第一个表中的多个记录相关. 这种类型的关系需要一个称为连接表的第三个表.连接表包含另两个表中的主键,并将它们用作其外键. 例如,"订单"表和"产品"表具有多对多关系.一个订单可以包含多种产品,每种产品可

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的. 在一个关系型数据库中,利用关系可以避免多余的数据.例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名.出版日期和出版社.您也可能保存有关出版社的信息,诸如出版社的电话.地址和邮政编码.如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码. 更好的方法是将有关出版社的信息在单独的表,publ

mybatis的一对多,多对一,以及多对对的配置和使用

1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧 2.首先我们开始对mybatis的一对多的探究 根据这个应用场景,我们需要获取在查询一个用户信息的时候还要去读取这个用户发布的帖子 现在我们来看一看用户级联文章在JavaBean中的编写方式,这就是一对多在JavaBean中的配置 现在我们再来看一看Mybatis的Mapper该如何编写一对多?很简单,就是在resultMap标签中配置<collection>标签,用

hibernate(四)一对多单向、多对一双向、自身双向关联

?经过前几篇文章的简略总结,主要认识了关于hibernate的基本认识,顺便认识了hibernate的简单的一个原理.具体参见 Hibernate (一)hibernate入门 Hibernate(二)hibernate原理简单实现对比JDBC hibernate(三)入门级--hibernate实例 从这篇文章开始就接触具体hibernate是如何来配置使用,更多的是一些细节的掌握.首先需要声明的是作者也是在诸多资料和工作学习中不断在更新自己关于知识的理解,难免出现一些在现阶段的主观认识和片面

mybatis之一对多

今天主要话题围绕这么几个方面? mybatis一对多示例 sql优化策略 一.mybatis之一对多 在说一对多之前,顺便说一下一对一. 一对一,常见的例子,比如以常见的班级例子来说,一个班主任只属于一个班级(排除某个班主任能力超群可兼任多个班级). 例如: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper

mybatis一对一关联关系映射

mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加"一"的一方的主键作为外键. 多对多关系:产生中间表引入两张表的主键作为外键,将两个主键作为联合主键或者引入新的字段作为这个中间表的主键. 一对一关联关系 例如person和IDcard,一个人只有一个身份证号,而一个身份证号只对应一个人. 以上是person表和IDcard表. public

mybatis一对一映射配置详解

听说mybatis一对一有三种写法,今天我试了一下. 数据库表准备 为了偷懒,我直接就拿用户权限菜单里的菜单表和菜单与权限的中间表做实现,他们原来是多对多的关系,这边我假设这两张表是一对一. 表  gl_role_men:id,role_id,menu_id     --------->  实体类 GlrolemenuModel  private String id;private String roleId;private String menuId;private MenuModel men