Mybatis之联表查询(多对多)_Ich will mit dir S wim的博客-程序员秘密_多对多连表查询

技术标签: 数据库开发  Mybatis  

使用 <resultMap>标签以及<association><collection>子标签,进行关联查询.

Pojo里面的User类

public class User implements Serializable {
    
    private Integer id;
    private String username;
    private String address;
    private Date birthday;
    private String sex;

    private List<Role> roles;

    public List<Role> getRoles() {
    
        return roles;
    }

    public void setRoles(List<Role> roles) {
    
        this.roles = roles;
    }

    public Integer getId() {
    
        return id;
    }

    public void setId(Integer id) {
    
        this.id = id;
    }

    public String getUsername() {
    
        return username;
    }

    public void setUsername(String username) {
    
        this.username = username;
    }

    public String getAddress() {
    
        return address;
    }

    public void setAddress(String address) {
    
        this.address = address;
    }

    public Date getBirthday() {
    
        return birthday;
    }

    public void setBirthday(Date birthday) {
    
        this.birthday = birthday;
    }

    public String getSex() {
    
        return sex;
    }

    public void setSex(String sex) {
    
        this.sex = sex;
    }

    @Override
    public String toString() {
    
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                '}';
    }
}

Pojo里面的Role类

public class Role implements Serializable {
    
    private Integer roleId;
    private String roleName;
    private String roleDesc;
    private List<User> users;

    public List<User> getUsers() {
    
        return users;
    }

    public void setUsers(List<User> users) {
    
        this.users = users;
    }

    public Integer getRoleId() {
    
        return roleId;
    }

    public void setRoleId(Integer roleId) {
    
        this.roleId = roleId;
    }

    public String getRoleName() {
    
        return roleName;
    }

    public void setRoleName(String roleName) {
    
        this.roleName = roleName;
    }

    public String getRoleDesc() {
    
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
    
        this.roleDesc = roleDesc;
    }

    @Override
    public String toString() {
    
        return "Role{" +
                "roleId=" + roleId +
                ", roleName='" + roleName + '\'' +
                ", roleDesc='" + roleDesc + '\'' +
                '}';
    }
}

Dao层的接口

 List<Role> findAll();//查询所有

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.xia.dao.IRoleDao">
    <!--别名只是给类取的,他这个resultMap是因为类里面的变量名与数据库字段名不一样-->
    <!--定义Role表的resultMap-->
    <resultMap id="roleMap" type="com.xia.domo.Role">
        <id property="roleId" column="rid"></id>
        <result column="role_name" property="roleName"></result>
        <result column="role_desc" property="roleDesc"></result>
        <collection property="users" ofType="com.xia.domo.User" >
            <id property="id" column="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_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 u.*,r.id AS rid,r.role_name,r.role_desc FROM USER u
            LEFT OUTER JOIN user_role ur ON u.id=ur.uid
            LEFT OUTER JOIN role r ON r.id=ur.rid

    </select>
</mapper>

user表:
在这里插入图片描述
user_role表:
在这里插入图片描述
role表:
在这里插入图片描述

此处sql查询的结果为:
在这里插入图片描述

查询如有不懂参考:SQL 内连接(inner join)与外连接(left outer join 、right outer join )区别.

测试代码:

public class RoleTest {
    

    private InputStream in;
    private SqlSession sqlSession;
    private IRoleDao iRoleDao;
    @Before//用于在测试方法执行之前执行
    public void init() throws IOException {
    
        //1.读取配置文件,形成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory对象
        SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(in);
        //3.SqlSession对象
        sqlSession=factory.openSession();
        //4.获取dao的代理对象
        iRoleDao = sqlSession.getMapper(IRoleDao.class);
        //5.执行查询所有方法
    }

    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
    
        //提交事务
        // sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }

    /**
     * 测试查询所有角色,同时获取用户信息
     * @throws IOException
     */
    @Test
    public void TestFindAll() throws IOException {
    

        List<Role> roles = iRoleDao.findAll();
        for (Role role:roles) {
    
            System.out.println(role);
            System.out.println(role.getUsers());
        }

    }
}

结果:
在这里插入图片描述
结果相符,很nice!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xjszsd/article/details/121973521

智能推荐

python基础(函数式编程(高阶函数)map、filter、reduce、lambda匿名函数)_旅立の涯秸的博客-程序员秘密

函数式编程可能习惯了像使用其他对象(字符串、数、序列等)一样使用函数:将其赋给变量,将其作为参数进行传递,以及从函数返回它们。在 Python 中,通常不会如此倚重函数(而是创建自定义对象),但完全可以这样做。Python提供了一些有助于进行这种函数式编程的函数:map、filter和reduce。在较新的Python版本中,函数map和filter的用途并不大,应该使用列表推导来替代它们。...

matlab方程和数值计算_lingboboo的博客-程序员秘密_matlab方程数值求解

1.sym2poly(s)返回一个包含符号多项式的数值系数的行向量。系数是按照多项式中独立变量幂值的降序来排列的。换句话说,向量c首先包含多项式最高项的系数,然后是次高项系数,以此类推。syms xsym2poly(x^3 - 2*x - 5)返回:ans =1 0 -2 -52.poly2sym( c )按降幂排列的多项式系数向量转化为符号多项式返回一个符号多项式,多项式系数在数值向量c中。默认的符号变量是x。变量v可以被指定作为第二个输入参数。3.y = polyval(p,x)

STM32 SWD无法调试或无法进入到main函数的两种情况_万里123的博客-程序员秘密_stm32 无法进入调试

最近使用STM32系列处理器开发项目的过程中,遇到了SWD Debug无法进去到main函数入口的问题,总共遇到了两种情况,总结如下:(1)情况1: Keil集成开发环境uVision配置中,“Option for target -&gt; target -&gt; Use MicroLib”选项没有勾选,勾选后问题解决。如下图:(2)情况2:Keil集成开发环境uVision配置中...

关于kali中base64的加解密使用_Wood木头的博客-程序员秘密_base64解码 kali

关于kali中base64的加解密使用有时候我们在抓包的途中会发现,很多数据都是以类base64的形式存在的,拿到Docoder中解密又是二进制或者其他形式的乱码!有时候说不定是压缩包的二进制呢。众所周知,基础的base64是由A-Z、a-z、0-9、+、/组成的kali中如何使用base64base64 【选项】 【文件/base64码】选项:-d,,–decode 解码数据-i, --ignore-garbag 解码时忽略非字母字符,这玩意儿还可以绕过编码流中的无效字符

从零开始做自动驾驶1 GNSS模块_你好哇zzz的博客-程序员秘密

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、自动驾驶开源代码二、GNSS模块1.GNSS 数据结构2.GNSS的订阅模块总结前言提示:跟随大神手敲一遍自动驾驶代码。一、自动驾驶开源代码来源:https://zhuanlan.zhihu.com/p/105512661记录出现的问题和进度二、GNSS模块1.GNSS 数据结构头文件: 类中为什么设置static 成员函数、成员变量的?static成员变量为啥类外初始化? Geographic

Android 源码分析之基于Stagefright的MediaPlayer播放框架[4]_avel__的博客-程序员秘密

先上图,以免一大堆的代码引来大家的不适。在prepare结束后,就可以调用start方法开始播放了。为了简单起见,我们对start之前的调用关系不做分析,仅仅列出这些方法的实现。public void start() throws IllegalStateException { if (isRestricted()) { _setVo

随便推点

mysql安装2019.9.4_Kakio的博客-程序员秘密

mysql直接下载免安装版,解压完之后,在cmd里面设置账号密码,然后安装可视化图形操作,sqlyog,要替换注册表,否则是收费版的

PAT甲级1072 Gas Station (30 分)题解_程勇uestc的博客-程序员秘密

\quad这个题要求每个加油站到所有居住地的最短距离,最长距离和平均距离。其中最长距离用于判断该加油站位置是否符合要求,最短距离和平均距离需要输出并保留一位小数。我用1到N表示居民居住地,N+1到N+M+1表示加油站,这样计算出某个加油站到其他地点的距离,保存在数组中,再进行处理。\quad在所有位置合法的加油站中,以最大化该加油站到居住地的最短距离为第一标准,最小化加油站到居住地的平均距离为...

C语言复习--数组_玖生_1的博客-程序员秘密

一、定义和引用一维数组1.定义一维数组的一般形式为:类型符 数组名[常量表达式];例如:int a[10];即定义了一个整形数组,包含10个整型元素。注:数组的下标是从0开始的,即10个整型元素分别为a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。2.引用数组元素的表示形式为:数组名[下标];例如:a[7]即为数组a中序号...

ZOJ-Intervals_KEMNHan的博客-程序员秘密

题意:最少拿走哪几个区间可以保证覆盖区间三个内至少有一对不相交贪心做法,根据左端点进行排序,右端点大的优先被拿走,影响最小的保留,三个排序判断位置,队列维护下index数组存一下下标。#include&lt;bits/stdc++.h&gt;#define LL long longusing namespace std;const int maxn=50005;i...

macos big sur系统写入权限被限制的这几款软件已经修复!包括cad2021_mac666999的博客-程序员秘密_bigsur系统写入权限

macOS Big Sur正式版将强大实力和优美外观的结合提升到一个崭新的高度。精心雕琢的全新设计,让您能淋漓尽致地感受 Mac 的魅力;Safari 浏览器迎来重大更新,待您饱览;地图 App 和信息 App 满载新功能,任您探索;更透明的***权限,保护也更周到。新系统升级总要一段时间的磨合期,限制各种软件不兼容和奔溃问题还是屡屡存在,特别是一些软件的注册机直接被限制打开,本站为了方便用户专门修复了cad2021中文版,OmniGraffle Pro版和Mindjet MindManager 201

20150131--XML上_weixin_30553837的博客-程序员秘密

20150131--XML上 万能的数据传输格式——XML上 目录 万能的数据传输格式——XML上... 1 一、XML简介... 3 1、历史起源... 3 2、什么是xml 3 3、xml与html区别... 4 4、xml应用场景... 4 1)充当程序间...