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>

浙公网安备 33010602011771号