11-表之间关系
时间:2019-08-24
本文章向大家介绍11-表之间关系,主要包括11-表之间关系使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
一、表之间的关系
- 一对多
- 多对一
- 一对一
- 多对多
特例:
如果拿出每一个订单,他都只能属于一个用户
所以 Mybatis 就把多对一看成了一对一
二、mybatis中的多表查询
Ⅰ一对一
1.示例:用户和账户
- 一个用户可以有多个账户
- 一个账户只能属于一个用户(多个账户也可以属于同一个用户)
2.步骤
- 建立两张表:用户表,账户表
- 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
- 建立两个实体类:用户是类和账户实体类
- 让用户和账户的实体类能体现出来一对多的关系
- 建立两个配置文件‘
- 用户的配置文件
- 账户的配置文件
- 实现配置
- 当我们查询用户时,可以是同时得到用户下所包含的账户信息
- 当我们查询账户时,可以同时得到账户的所属用户信息
- 重新写一个 account 的接口与实体类
- 格外写个 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>
结果
-----------每个角色信息-------------
Role{roleId=1, roleName='院长', roleDesc='学员管理者'}
[User{id=1, username='龙族', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳'}, User{id=3, username='罪人', password='123', birthday=Tue Jul 23 00:00:00 CST 2019, address='堕落之地'}]
-----------每个角色信息-------------
Role{roleId=2, roleName='CEO', roleDesc='首席执行官'}
[User{id=1, username='龙族', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳'}, User{id=2, username='信守斩龙', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳'}]
-----------每个角色信息-------------
Role{roleId=3, roleName='暗部', roleDesc='光明下的黑暗组织'}
[User{id=2, username='信守斩龙', password='123', birthday=Mon Oct 12 00:00:00 CST 1998, address='浏阳'}]
原文地址:https://www.cnblogs.com/zuiren/p/11406128.html
- ruby学习笔记(4)-动态修改类的属性
- 如果技术是一种生命
- ruby学习笔记(2)--类的基本使用
- 域名资讯:四声域名BHHS.com被BHHS公司收购
- ruby学习笔记(1)--初识语法
- 无法启用数据库中的 Service Broker,因为已存在启用的具有相同 ID 的 Service Broker。
- Centos7.2下针对LDAP的完整部署记录
- .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言
- 温故而知新:设计模式之适配器模式(Adapter)
- .NET Core RC2/RTM 明确了时间表
- kvm虚拟化关闭虚拟网卡virbr0的方法
- NET开发学习项目资源(2)
- Linux下selinux简单梳理
- 一段oracle中的“复杂”分组统计sql
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法