示例:用户和角色
  一个用户可以有多个角色
  一个角色可以赋予多个用户
步骤:
  1、建立两张表:用户表,角色表
    让用户表和角色表具有多对多的关系。

    需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
  2、建立两个实体类:用户实体类和角色实体类
    让用户和角色的实体类能体现出来多对多的关系
    各自包含对方一个集合引用
  3、建立两个配置文件
    用户的配置文件
    角色的配置文件
  4、实现配置:
    当我们查询用户时,可以同时得到用户所包含的角色信息
    当我们查询角色时,可以同时得到角色的所赋予的用户信息

role表:

user表:

user_role表:

实现 Role 到 User 多对多

需求:

  实现查询所有角色并且加载它所分配的用户信息

分析: 

  查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息

  而是要通过中 间表(USER_ROLE 表)才能关联到用户信息。

实现的 SQL 语句:

  SELECT role.id as rid , role.role_name , role.role_desc  ,   user.*

  FROM  role

  INNER JOIN  user_role

  ON ( role.id = user_role.rid)

  INNER JOIN  user

  ON (user_role.uid = user.id);

   

创建角色实体类Role

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

编写 Role 持久层接口

public interface IRoleDao  {
List<Role> findAll();
}

编写持久层接口IRoleDao对应的映射配置文件IRoleDao.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.mkl.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 role.id as rid , role.role_name , role.role_desc, user.*
FROM ROLE
INNER JOIN USER_ROLE
ON ( ROLE.id = USER_ROLE.rid)
INNER JOIN USER
ON (USER_ROLE.uid = USER .id);
</select>
</mapper>

User到Role 多对多

实体类User中 :

    private List<Role> roles;

    /*get set */

IUserDao.xml :

    <resultMap id="userMap" type="user">
<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 property="roles" ofType="role">
<id property="roleId" column="rid"></id>
<result property="roleName" column="role_name"></result>
<result property="roleDesc" column="role_desc"></result>
</collection>
</resultMap> <!-- 查询所有user -->
<select id="findAll" resultMap="userMap">
SELECT role.id as rid , role.role_name , role.role_desc, user.*
FROM ROLE
INNER JOIN USER_ROLE
ON ( ROLE.id = USER_ROLE.rid)
INNER JOIN USER
ON (USER_ROLE.uid = USER .id);
</select>

Mybatis中的多表查询 多对多的更多相关文章

  1. Mybatis中的多表查询 多对一,一对多

    示例:用户和账户 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 步骤: 1.建立两张表:用户表,账户表 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中 ...

  2. MyBatis中实现多表查询

    如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1  业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...

  3. 在Mybatis中使用连表查询的一次实际应用

    以前在工作中很少使用多表关联查询,对连表查询的具体作用和使用场景也没有很直观的认识,通过这次在项目中的实际应用,对此有了一定的认识,特记录如下. 关联表介绍: 分别是属性表attr_info.属性值表 ...

  4. Hibernate中的多表查询及抓取策略

    1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...

  5. mysql中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...

  6. MyBatis学习之多表查询

    一对多需求:即一张表class中又含有多张表(teacher,student)内容.现根据class_id 来获取对应的班级信息(包括学生和老师信息) 方式一:嵌套结果 使用嵌套结果映射来处理重复的联 ...

  7. Mybatis学习——一对一关联表查询

    1.SQL语句建表 CREATE TABLE teacher( t_id ) ); CREATE TABLE class( c_id ), teacher_id INT ); ALTER TABLE ...

  8. MyBatis总结-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  9. django中的跨表查询梳理

    1.前言 最近在写一个小项目,里面主要涉及的就是表与表之间复杂的关系.当真正开发起来的时候,才发现自己对复杂的表关系间的查询有点混乱,趁着这几天的时间,重新梳理了一下. 2.概念 在开始之前,先明确几 ...

随机推荐

  1. DevOps介绍

    DevOps 也同样要通过技术工具链完成持续集成.持续交付.用户反馈和系统优化的整合.Elasticbox 整理了 60+ 开源工具与分类,其中包括版本控制&协作开发工具.自动化构建和测试工具 ...

  2. Dynamics CRM 2011 Web Service

    Data Services:   SOAP Endpoint REST Endpoint Capabilities Assign Records Retrieve Metadata Execute M ...

  3. 40个Java多线程问题总结【转】

    1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...

  4. Eclipse maven工程生命周期clean、compile、test、package

    1.清理. 编译 工程右键->Run As->Maven build... 清理.编译操作控制台信息输出: 2.测试  同清理.编译,goals改成test 3.打包  同清理.编译,go ...

  5. 优化深度神经网络(二)优化算法 SGD Momentum RMSprop Adam

    Coursera吴恩达<优化深度神经网络>课程笔记(2)-- 优化算法 深度机器学习中的batch的大小 深度机器学习中的batch的大小对学习效果有何影响? 1. Mini-batch ...

  6. SqlServer——临时表

    1.表的类型: SqlServer数据库中分为两个表:永久表.临时表:通过表名的前缀区分. 永久表:与物理文件.C# 中的静态类 类似,任何用户均可对其执行操作并且相互影响: 临时表:简单的说就是使用 ...

  7. USACO2.1.3 三值排序

      Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交 ...

  8. The 1st day of learning Python

    This is the first day of studying Python. From 3PM to now, It has taken me nearly 5 hours to 初步了解 py ...

  9. Leetcode:ZigZag Conversion分析和实现

    问题的大意就是将字符串中的字符按锯齿状(倒N形)垂直由上向下放置,最后水平从左向右读取.比如 ABCDEFGHIJKLMN,4表示 A          G      M B      F  H    ...

  10. Python程序调试-TabError: inconsistent use of tabs and spaces in indentation

    报错信息:TabError: inconsistent use of tabs and spaces in indentation 说明:代码缩进统一使用Tab键或空格键,不能混用. 解决办法: 1. ...