zoukankan      html  css  js  c++  java
  • Mybatis中的多表查询 多对多

    示例:用户和角色
      一个用户可以有多个角色
      一个角色可以赋予多个用户
    步骤:
      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>
  • 相关阅读:
    常用的排序算法的时间复杂度和空间复杂度
    VMWare虚拟机设置固定IP上网方法
    哈希表的冲突处理方法
    lua ipairs和pairs的区别 .
    NP完全问题
    java+selenium+new——文本框的输入、清空——按钮的单击
    java+selenium+new——操作单选按钮——使用list容器进行遍历
    java+selenium+new——对某个元素进行双击(举例示例操作)
    java+selenium+new——操作单选下拉列表——打印每一个选项——3种方法选中某一个选项——select类
    java+selenium+new——对当前浏览器窗口进行截屏,保存到指定文件夹,并取名
  • 原文地址:https://www.cnblogs.com/mkl7/p/10757470.html
Copyright © 2011-2022 走看看