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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具