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>
  • 相关阅读:
    ASP.NET(C#)图片加文字、图片水印
    CMake构建Visual Studio中MFC项目的Unicode问题
    用Visual Studio 2008(VS)编译WebKit的r63513
    此时学习中
    ASP.NET进阶——初学者的提高(长期)
    继续努力
    程序员阿士顿的故事
    iOS 深拷贝和浅拷贝
    Javascript中this的取值
    Lisp的本质(The Nature of Lisp)
  • 原文地址:https://www.cnblogs.com/mkl7/p/10757470.html
Copyright © 2011-2022 走看看