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

Mybatis 一对一,一对多,多对一,多对多的理解
First (一对一)

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

怎么来实现呢?

这里我介绍了两种方式:

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

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

复制代码

<?xml version="1.0" encoding="UTF-8" ?>
    <!-- 
     方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
             封装联表查询的数据(去除重复的数据)
     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>
复制代码

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

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

这里ben层会发生变化 这个classes的被bean层会多一个Teacher的属性,并且增加的get,set方法。

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

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

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

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

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

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

一对多的xml配置:

复制代码

<?xml version="1.0" encoding="UTF-8" ?> SELECT * FROM t_customer WHERE id=#{id} 复制代码

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

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

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

Third (多对多)

  多对多又怎么理解呢?

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


复制代码

<?xml version="1.0" encoding="UTF-8"?>
<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;
    }
    }
    复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值