MyBatis多表关联查询(一对多/多对一/多对多)

一、多表设计概述

一对一:可以设计成一张表结构

一对多:一个用户对应多个账户

多对一:多个账户属于同一个用户

多对多:用户与角色之间的关系

二、环境搭建

创建 account 表:

复制代码
CREATE TABLE `account` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `UID` int(11) default NULL COMMENT '用户编号',
  `MONEY` double default NULL COMMENT '金额',
  PRIMARY KEY  (`ID`),
  CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `account`(`ID`,`UID`,`MONEY`) values 
(1,1,1000),(2,2,1000),(3,2,2000);

创建 Account 实体类:

复制代码
public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;

//自己补充get/set方法,toString方法
}

三、多对一查询(一对一)

需求:查询账户信息时,同时查询出所属用户的信息。

在 Account 类中添加 User 属性:

复制代码
private User user;

<resultMap id="accountMap" type="Account">
    <result property="id" column="id"/>
    <result property="uid" column="uid"/>
    <result property="money" column="money"/>
    <association property="user" javaType="User">
        <result property="username" column="username"/>
        <result property="address" column="address"/>
    </association>
</resultMap>

<select id="findAll" resultMap="accountMap">
    select a.*, u.username, u.address 
    from account a, user u 
    where a.uid = u.id
</select>

四、一对多查询

需求:查询用户信息时,同时查询该用户的所有账户。

在 User 类中添加 List<Account> 属性:

复制代码
private List<Account> accounts;

<resultMap id="userMap" type="User">
    <result property="id" column="id"/>
    <result property="username" column="username"/>
    <collection property="accounts" ofType="Account">
        <result property="money" column="money"/>
    </collection>
</resultMap>

<select id="findOneToMany" resultMap="userMap">
    select u.*, a.money 
    from user u left join account a on u.id = a.uid
</select>

五、多对多查询

创建角色表和用户-角色关联表:

复制代码
CREATE TABLE `role` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `ROLE_NAME` varchar(30) default NULL COMMENT '角色名称',
  `ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_role` (
  `UID` int(11) NOT NULL COMMENT '用户编号',
  `RID` int(11) NOT NULL COMMENT '角色编号',
  PRIMARY KEY  (`UID`,`RID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

public class Role implements Serializable {
    private Integer id;
    private String role_name;
    private String role_desc;
    private List<User> users;
    // getter/setter,toString补充上
}

<select id="findAll" resultMap="roleMap">
    SELECT r.*, u.username 
    FROM USER u, user_role ur, role r 
    WHERE u.id = ur.UID AND ur.RID = r.ID
</select>

<resultMap id="roleMap" type="role">
    <id property="id" column="id"/>
    <result property="role_name" column="role_name"/>
    <result property="role_desc" column="role_desc"/>
    <collection property="users" ofType="user">
        <result property="username" column="username"/>
    </collection>
</resultMap>
相关推荐
山甫aa20 小时前
Javaweb---MyBatis增删改查
java·数据库·后端·mybatis·springboot
choumou_M1 天前
SpringBoot_2:MyBatis-Generator插件使用教程
spring boot·tomcat·mybatis
SQL-First布道者1 天前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc
晚安code3 天前
MyBatis-Plus 分页插件与字段自动填充:两行配置告别 CRUD 重复劳动
mybatis
SQL-First布道者4 天前
持久层框架的评价标准:只有一个
java·spring boot·spring·tomcat·mybatis·spring jdbc
步行cgn4 天前
MyBatis 高级映射与延迟加载完全指南
java·tomcat·mybatis
mashirro4 天前
记一次基于ruoyi-vue新增小程序服务模块,小程序登陆相关
vue.js·小程序·mybatis
边境悍匪4 天前
蜗牛学苑 Java 智能体学习 Day24|SpringBoot 整合 MyBatis、分层解耦思维导图复盘
java·数据库·spring boot·学习·mybatis
抓哇小菜鸡5 天前
Spring Boot + 本地大模型(Ollama/DeepSeek) + MyBatis-Plus 企业级智能体数据分析系统从零到一源码全解析
spring boot·后端·mybatis