一、实现 Role User 多对多

多对多关系其实我们看成是双向的一对多关系。

1.用户与角色的关系模型

2.业务要求及实现 SQL

需求:
实现查询所有角色并且加载它所分配的用户信息。
分析:
查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到,而是要通过中
间表(USER_ROLE 表)才能关联到用户信息。
下面是实现的 SQL 语句:
SELECT u.*, r.id AS rid, r.role_name, r.role_descFROM role rLEFT OUTER JOIN user_role ur ON r.id = ur.ridLEFT OUTER JOIN USER u ON u.id = ur.uid;

3.编写角色实体类

@Data
public class Role implements Serializable {private Integer roleId;private String roleName;private String roleDesc;//多对多的关系映射:一个角色可以赋予多个用户private List<User> users;}

4.编写 Role 持久层接口

public interface IRoleDao {/*** 查询所有角色* @return*/List<Role> findAll();
}

5.编写映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.oesoft.mybatis01.dao.IRoleDao"><!--定义 role 表的 ResultMap--><resultMap id="roleMap" type="role"><id property="roleId" column="rid"></id><result property="roleName" column="role_name"></result><result property="roleDesc" column="role_desc"></result><collection property="users" ofType="user"><id column="id" property="id"></id><result column="username" property="username"></result><result column="address" property="address"></result><result column="sex" property="sex"></result><result column="birthday" property="birthday"></result></collection></resultMap><!--查询所有--><select id="findAll" resultMap="roleMap">select u.*, r.id as rid, r.role_name, r.role_descfrom role rleft outer join user_role ur on r.id = ur.ridleft outer join user u on u.id = ur.uid</select>
</mapper>

6.编写测试类

public class RoleTest {private InputStream in;private SqlSession sqlSession;private IRoleDao roleDao;@Before//用于在测试方法执行之前执行public void init()throws Exception{//1.读取配置文件,生成字节输入流in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.获取 SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//3.获取 SqlSession 对象sqlSession = factory.openSession(true);//4.获取 dao 的代理对象roleDao = sqlSession.getMapper(IRoleDao.class);}@After//用于在测试方法执行之后执行public void destroy()throws Exception{//提交事务// sqlSession.commit();//6.释放资源sqlSession.close();in.close();}/*** 测试查询所有*/@Testpublic void testFindAll(){List<Role> roles = roleDao.findAll();for(Role role : roles){System.out.println("---每个角色的信息----");System.out.println(role);System.out.println(role.getUsers());}}
}

二、实现 User Role 的多对多

从 User 出发,我们也可以发现一个用户可以具有多个角色,这样用户到角色的关系也还是一对多关系。这样
我们就可以认为 User 与 Role 的多对多关系,可以被拆解成两个一对多关系来实现。
SELECT u.*, r.id AS rid, r.role_name, r.role_descFROM `USER` uLEFT OUTER JOIN user_role ur ON u.id = ur.uidLEFT OUTER JOIN role r ON r.id = ur.rid;
private List<Role> roles;
/*** 查询所有用户,同时获取出每个用户被分配的所有角色* @return*/List<User> findAllWithRoles();
<!-- 建立 User 实体(包含角色)和数据库表的对应关系type 属性:指定实体类的全限定类名id 属性:给定一个唯一标识,是给查询 select 标签引用用的。--><resultMap type="user" id="userWithRolesMap"><id column="id" property="id"></id><result column="username" property="username"/><result column="address" property="address"/><result column="sex" property="sex"/><result column="birthday" property="birthday"/><!-- collection 是用于建立一对多中集合属性的对应关系ofType 用于指定集合元素的数据类型--><collection property="roles" ofType="role"><id column="rid" property="roleId"/><result column="role_name" property="roleName"/><result column="role_desc" property="roleDesc"/></collection></resultMap><!-- 配置查询所有操作 --><select id="findAllWithRoles" resultMap="userWithRolesMap">SELECT u.*, r.id AS rid, r.role_name, r.role_descFROM `USER` uLEFT OUTER JOIN user_role ur ON u.id = ur.uidLEFT OUTER JOIN role r ON r.id = ur.rid</select>
/*** 测试查询所有用户,包含角色*/@Testpublic void testFindAllWithRoles(){List<User> users = userDao.findAllWithRoles();for(User user:users){System.out.println("---每个用户的信息----");System.out.println(user);System.out.println(user.getRoles());}}

10-Mybatis 多表查询之多对多相关推荐

  1. java day55【 Mybatis 连接池与事务深入 、 Mybatis 的动态 SQL 语句、 Mybatis 多表查询之一对多 、 Mybatis 多表查询之多对多】...

    第1章 Mybatis 连接池与事务深入 1.1 Mybatis 的连接池技术 1.1.1 Mybatis 连接池的分类 1.1.2 Mybatis 中数据源的配置 1.1.3 Mybatis 中 D ...

  2. Mybatis联表查询:多对多(注解实现)

    1.数据库表结构 2.返回结果类封装 CommentWithTag .java @Getter @Setter @ToString @Builder @AllArgsConstructor @NoAr ...

  3. mybatis多表查询(一对多,多对一,多对多)

    mybatis多表查询.多对一,一对多,多对多 多对一.一对多 准备阶段 建立dept实体类和emp实体类 建立Dao接口 写Dao的Mapper映射 多对多 多对一.一对多 准备阶段 建立一个部门表 ...

  4. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  5. Mybatis多表查询之一对多、多对一

    目录 前言 一.建立数据库 二.多对一查询 2.1 编写实体类 2.2 编写接口 2.3 编写Mapper配置文件 (StudentMapper.xml) 2.4 多对一查询结果 三.一对多查询 3. ...

  6. MyBatis多表查询之XML和注解实现(resultMap结果集映射配置数据库字段与实体类属性一一映射)

    MyBatis多表查询 多表模型分类 一对一:在任意一方建立外键,关联对方的主键. 一对多:在多的一方建立外键,关联一的一方的主键. 多对多:借助中间表,中间表至少两个字段,分别关联两张表的主键. 数 ...

  7. Mybatis—多表查询

    Mybatis多表查询 一对一查询 一对一查询的模型MapperScannerConfigurer 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 创建Order和User实体 ...

  8. mybatis联表查询且统计数据

    mybatis联表查询且统计数据 表1的数据+表2的数据的统计==>vo接收 前端原型图如下: 涉及到两张表 t_record t_user_record 详情A/B A:未签收人数 B:全部人 ...

  9. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    视频地址:http://edu.51cto.com/sd/be679 在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实 ...

  10. Mybatis学习笔记 4:Mybatis 连表查询(一)——一对多关系

    完整代码在这 在查询数据库时,我们经常会遇到多张表联合查询的情况,而Mybatis使连表查询更加简便了,查询出的数据格式非常易于使用,省去了一大部分复杂的代码编写工作,对于关系型数据库来说,数据模型之 ...

最新文章

  1. opencv把图片转换成二进制_如何增强图像,然后使用Python和OpenCV将其转换为二进制图像?...
  2. 帝国cms后台使用savesufer.js生成大音频audio彩色频谱数据
  3. 2015 计算机考研大纲,2015年考研计算机大纲详解:操作系统
  4. 各国家分析(马来西亚,秘鲁)
  5. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十:SDRAM模块③ — 页读写 α...
  6. linux系统说明文件目录,Linux系统目录结构说明
  7. 分支和循环结构的应用(习题)
  8. SQL2005 学记笔记(9)
  9. 加密保护软件 WinLicense常见问题整理大全(四)
  10. Mysql通过存储过程批量插入数据
  11. 医疗大数据分析需考虑哪些因素
  12. 奇盾安防监控视频恢复案例
  13. 一个简单企业信息网站架构
  14. struts2的s:datetimepicker日期时间标签选择器
  15. 计算机图形学完整笔记(七):曲线曲面 - 1
  16. 手把手带你SQLite3快速入门
  17. MIMO技术杂谈(一)浅谈分集与复用的权衡_akala啦_新浪博客
  18. matlab演奏《起风了》代码
  19. Linux /usr目录挂载到新分区
  20. 第四章:jQuery动画

热门文章

  1. Linu移植随笔:由ts_config:Success想到的
  2. python拿什么做可视化界面好_5大Python可视化库到底选哪个好?一篇文章搞定从选库到教学...
  3. 【java】java 新一代垃圾回收器ZGC的探索与实践
  4. 95-910-144-源码-FlinkSQL-Flink的UDF
  5. 【Flink】Flink 1.13 将数据 写入 到 elasticsearch 7 案例
  6. 【kafka】kafka topic某些分区 副本落后leader太多
  7. 【Elasticsearch】es 查询 multi_match 与 match_phrase
  8. 【LogStash】LogStash 配置后无法启动的问题
  9. 【registry】registry An exception was thrown while processing request with message
  10. 工具包:Safetype Config使用