11-表之间关系

Posted zuiren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11-表之间关系相关的知识,希望对你有一定的参考价值。

一、表之间的关系

  • 一对多
  • 多对一
  • 一对一
  • 多对多

特例:

? 如果拿出每一个订单,他都只能属于一个用户

? 所以 Mybatis 就把多对一看成了一对一

二、mybatis中的多表查询

Ⅰ一对一

1.示例:用户和账户

  1. 一个用户可以有多个账户
  2. 一个账户只能属于一个用户(多个账户也可以属于同一个用户)

2.步骤

  1. 建立两张表:用户表,账户表
    • 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
  2. 建立两个实体类:用户是类和账户实体类
    • 让用户和账户的实体类能体现出来一对多的关系
  3. 建立两个配置文件‘
    • 用户的配置文件
    • 账户的配置文件
  4. 实现配置
    • 当我们查询用户时,可以是同时得到用户下所包含的账户信息
    • 当我们查询账户时,可以同时得到账户的所属用户信息
  5. 重新写一个 account 的接口与实体类
  6. 格外写个 mapping.xml 对应接口

实体类参数

    private Integer id;
    private Integer uid;
    private double money;

    private User user;

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="dao.IAccountDao">

    <!--定义封装account和user的resultMap-->
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="aid"/>
        <result property="uid" column="uid"/>
        <result property="money" column="money"/>

        <!--一对一的关系映射,配置封装user的内容-->
        <!--javaType 告诉下面那个封装到那个对象,因为有别名,所以直接用 user-->
        <association property="user" column="uid" javaType="user">
            <id property="id" column="id" />
            <result property="username" column="username"/>
            <result property="password" column="password"/>
            <result property="birthday" column="birthday"/>
            <result property="address" column="address"/>
        </association>
    </resultMap>

    <select id="findAll" resultMap="accountUserMap">
        select u.*,a.id as aid,a.uid,a.money from account a,user u where u.id=a.id;
    </select>
</mapper>

Ⅱ一对多查询

一个用户可拥有多个账户

1.实体类

    private Integer id;
    private String username;
    private String password;
    private Date birthday;
    private String address;

    //一对多关系映射,主表实体应该包括从表实体的集合引用
    private List<Account> accounts;

2.map.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="dao.IUserDao">

    <!--定义user的resultMap-->
    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="birthday" column="birthday"/>
        <result property="address" column="address"/>
        <!--配置 user对象中 accounts 集合的映射-->
        <!--ofType 集合中元素类型 account 是别名-->
        <collection property="accounts" ofType="account">
            <!--column 起个别名-->
            <id column="aid" property="id"/>
            <result column="uid" property="uid"/>
            <result column="money" property="money"/>
        </collection>
    </resultMap>

    <!--不管有没有账户,用户的信息都得有,所以不能用内连接,所以用左外连接,会返回左表的所有数据-->
    <select id="findAll" resultMap="userAccountMap">
        select *from user u left outer join account a on u.id=a.uid;
    </select>
</mapper>

Ⅲ多对多

1.示例:用户和角色

  • 一个用户可以有多个角色,一个角色有多个用户

2.步骤

  • 建立两张表:用户表,角色表
    • 让用户表与角色表具有多对多,需要使用中间表
  • 实现配置
    • 查询用户,得到角色
    • 查询角色,得到用户

3.查询角色同时获取用户信息代码

实体类

    private Integer roleId;
    private String roleName;
    private String roleDesc;

    /*多对多的关系映射,一个角色可以赋予多个用户*/
    private List<User> users;

xml 配置

<mapper namespace="dao.IRoleDao">

    <!--定义 role 表的 ResultMao-->
    <resultMap id="roleMap" type="role">
        <id property="roleId" column="rid"/>
        <result property="roleName" column="role_name"/>
        <result property="roleDesc" column="role_desc"/>
        <collection property="users" ofType="user">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="password" column="password"/>
            <result property="birthday" column="birthday"/>
            <result property="address" column="address"/>
        </collection>
    </resultMap>

    <select id="findAll" resultMap="roleMap">
        select u.*,r.id as rid,r.role_name,r.role_desc from role r
        left outer join user_role ur on r.id =ur.rid
        left outer join user u on u.id =ur.uid
    </select>
</mapper>

结果

-----------每个角色信息-------------
RoleroleId=1, roleName='院长', roleDesc='学员管理者'
[Userid=1, username='龙族', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳', Userid=3, username='罪人', password='123', birthday=Tue Jul 23 00:00:00 CST 2019, address='堕落之地']
-----------每个角色信息-------------
RoleroleId=2, roleName='CEO', roleDesc='首席执行官'
[Userid=1, username='龙族', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳', Userid=2, username='信守斩龙', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳']
-----------每个角色信息-------------
RoleroleId=3, roleName='暗部', roleDesc='光明下的黑暗组织'
[Userid=2, username='信守斩龙', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳']

以上是关于11-表之间关系的主要内容,如果未能解决你的问题,请参考以下文章

hibernate表与表之间的关系(多对多关系)

如何定义来自不同来源的表之间的关系?

0914 表与表之间的关系补充一对一关系 记录操作 关键字 多对多 子查询

两个模型之间的关系与中间表

关于Python开发小程序的随笔path11

Hibernate入门—— 一对多多对多关系