MyBatis-多表操作

ManyToOne

表之间的关系如下图

接下来就来开始演示一下多表之间的查询步骤,首先来看一个分步查询,步骤如下

分步查询

  • 第一步:先查出所有的订单
  • 第二步:根据 id 查出对应 id 订单的客户

新建一个订单表简易版 SQL 如下

CREATE TABLE `t_order` (
  `order_id` int NOT NULL AUTO_INCREMENT,
  `order_num` int DEFAULT NULL,
  `order_time` datetime DEFAULT NULL,
  `order_note` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `cus_id` int DEFAULT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

新建对应的实体类如下

/**
 * @author BNTang
 */
@Data
public class Order {
    private Integer orderId;
    private Integer orderNum;
    private LocalDateTime orderTime;
    private String orderNote;
    
    private Customer customer;
}

新建 OrderMapper.java 接口代码如下

/**
 * @author BNTang
 */
public interface OrderMapper {
    List<Order> getOrders();
}

新建 OrderMapper.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="top.it6666.mapper.OrderMapper">
    <resultMap id="OrderMap" type="top.it6666.domain.Order">
        <result column="order_id" property="orderId"/>
        <result column="order_num" property="orderNum"/>
        <result column="order_time" property="orderTime"/>
        <result column="order_note" property="orderNote"/>
        <association property="customer"
                     javaType="top.it6666.domain.Customer"
                     select="top.it6666.mapper.CustomerMappter.getCustomerWithID"
                     column="cus_id"/>
    </resultMap>
    <select id="getOrders" resultMap="OrderMap">
        SELECT *
        FROM `t_order`;
    </select>
</mapper>

左连接查询

查询所有的订单及订单所对应的客户,左连接,把左边表的数据全部查出, 右边表只查出满足条件的记录,应对 SQL 如下

SELECT *
FROM `t_order` AS o
LEFT JOIN customer AS c ON o.cus_id = c.cust_id;

Order domain 同上

建立 Mapping 映射

上图是一种方式,除了上方的方式之外还有一种废话不多说如下图

测试类

/**
 * @author BNTang
 */
public class TestMain {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.openSession();
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        List<Order> orders = orderMapper.getOrders();
        System.out.println(orders);
        sqlSession.close();
    }
}

分步查询懒加载

<settings>
    <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载 -->
    <setting name="aggressiveLazyLoading" value="false"/>
    <!-- 指定哪个对象的方法触发一次延迟加载。-->
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode"/>
</settings>

添加

posted @   BNTang  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示