Mybatis 多表联查

2024-09-06 09:20
文章标签 多表 mybatis 联查

本文主要是介绍Mybatis 多表联查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

表关系: 一对一,一对多,多对多

  • 1vs1 丈夫表 --> 妻子表

  • 1 vs n 用户 --> 车辆/房产

  • n vs n 老师/商品 --> 学生/订单

多表联查的SQL

  • 内连接

    • select * from 表1 inner join 表2 on 表1.字段 = 表2.字段

    • select * from 表1, 表2 where 表1.字段 = 表2.字段

  • 外连接

    • select * from 表1 left join 表2 on 表1.字段 = 表2.字段

  • 子查询

1 OneToOne

需求: 实现一对一查询,查询订单以及对应的用户信息

数据: tb_user表, tb_order表

关系:

用户 ---> 订单 (1 VS N)     一个用户有多个订单
订单  ---> 用户 (1 VS 1)    一个订单只会属于一个人
public class OrderVO extends Order {private User user;// set get
}

OrderMapper.java接口文件

public interface OrderMapper {OrderVO findOrderWithUserByOid(int oid);
}

OrderMapper.xml映射文件

    <resultMap id="orderWithUserResultMap" type="OrderVO"><!-- 封装查询主体Order: --><id column="oid" property="oid"/><result column="order_time" property="orderTime"/><result column="order_desc" property="orderDesc"/><result column="uid" property="uid"/><!-- 一对一映射,需要封装关联的User对象 --><!-- 一对一映射,需要特殊标签 association--><!-- property="user" 是OrderVO类中的属性,javaType是user属性的类型 --><association property="user" javaType="com.qf.model.User"><!-- 下面正常的列和属性 一一映射 --><id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/><result column="phone" property="phone"/><result column="money" property="money"/><result column="create_time" property="createTime"/><result column="sex" property="sex"/></association></resultMap>
​<!-- 多表联查,直接返回resultType无法封装关联的那个对象,就需要使用     resultMap手动映射 --><select id="findOrderWithUserById" resultMap="orderWithUserResultMap">SELECTo.*,u.*FROMtb_order o,tb_user uWHEREo.uid = u.idAND o.oid = #{oid}</select>

2 OneToMore

需求: 一对多,查询用户关联查询出所有的订单

SELECT* 
FROMtb_user u
LEFT JOIN tb_order o ON u.id = o.uid 
WHEREu.id = 1

目的查询用户,以及关联多个订单,User类不够展现全部数据,那么就创建扩展类UserVO,UserVO类继承User就可以存储用户信息,还需要再UserVO类中添加Order类来存储信息,但是!!不是一个Order类,因为是一对多,一个用户关联多个订单,所有要设置List<Order>

User扩展实体类

public class UserVO extends User{
​private List<Order> orderList;// set get
}

UserMapper.java接口

public interface UserMapper {UserVO findUserWithOrdersById(int id);
}

UserMapper.xml映射文件

    <!-- 一对多 --><resultMap id="userWithOrdersResultMap" type="UserVO"><!-- 封装User对象 --><id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/><result column="phone" property="phone"/><result column="create_time" property="createTime"/><result column="money" property="money"/><result column="sex" property="sex"/><!-- 一对多关联映射使用collection标签 --><!-- property是UserVO类中关联的属性 --><!-- 不是javaType,是ofType,是指定集合中存储的数据类型 --><collection property="orderList" ofType="com.qf.model.Order"><id column="oid" property="oid"/><result column="order_time" property="orderTime"/><result column="order_desc" property="orderDesc"/><result column="uid" property="uid"/></collection></resultMap>
​<!-- 多表联查,另外的属性不会自动封装,需要使用resultMap --><select id="findUserWithOrdersById" resultMap="userWithOrdersResultMap">SELECT*FROMtb_user uLEFT JOIN tb_order o ON u.id = o.uidWHEREu.id = #{id}</select>

3 关联查询总结

  • 实体类要设置扩展类以用于封装多表的数据

    • 一对一,类中套类

    • 一对多,类中套集合

  • 正常封装使用resultMap

    • 一对一封装使用association

    • 一对多封装使用collection

 

这篇关于Mybatis 多表联查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141627

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除