好程序员Java学习路线分享MyBatis之关联查询,我们进行数据库查询时往往需要的不止一张表的数据,需要将多张表的数据一起查询出来,大家学习过数据库的连接查询,那么在MyBatis中如何将有关系的多张表数据进行关联查询呢。
表的结构
商品和订单是典型的一对多关系,下面的案例我们将以商品表和订单表作为示例,演示如何配置最常见的一对多关系,下面是两张表的结构:
商品表:
订单表:
实体类的设计
一种商品有多个订单,每个订单对应一种商品,在实体类中体现这个关系。
订单实体类:
/**
* 订单类
*/
public class Order {
private Integer id;
private Integer num;
private Integer goodsId;
private String time;
/**
* 订单对应的商品对象
*/
private Goods goods;
商品实体类:
/**
* 商品类
*/
public class Goods {
private Integer id;
private String name;
private Double price;
private String address;
/**
* 订单集合
*/
private List
Mapper接口设计
这里我们只介绍关联查询,所以只定义了基本的查询方法
/**
* 商品接口
*/
public interface GoodsDAO{
//根据编号查询商品
Goods selectById(int id);
}
/**
* 订单接口
*/
public interface OrderDAO{
//根据订单id查询订单
Order selectById(int orderId);
//根据商品id查询订单
List
}
collection标签
接下来就是重点了,我们在商品类中定义了订单集合属性orders,那么这个集合的数据如何进行查询呢?这就需要我们在mapper文件中使用collection标签。
collection标签用在resultMap标签中,用于配置集合的查询,用法是:
示例:
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
collection的意思是:
当商品对象需要orders集合时,就会调用OrderDAO的selectByGoodsId按商品id查询所有订单,商品id就是当前商品的goods_id值。
association标签
association标签的用法类似于collection,用于配置一对一的关系,每个订单中有一个商品对象goods,这个对象查询可以用association来进行配置。
用法:
示例:
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
association的意思是:
当订单对象需要goods对象时,就调用GoodsDAO的selectById按商品id查询商品,此商品id就是订单中的外键列order_goods_id。
单元测试
@Test
public void testGoodsAndOrders(){
GoodsDAO goodsDAO = MyBatisUtils.getSession().getMapper(GoodsDAO.class);
//查询商品
Goods goods = goodsDAO.selectById(1);
System.out.println("查询商品:"+goods);
//获得商品所有的订单
goods.getOrders().stream().forEach((order)->System.out.println("商品的订单"+order));
OrderDAO orderDAO = MyBatisUtils.getSession().getMapper(OrderDAO.class);
//查询订单
Order order = orderDAO.selectById(4);
System.out.println("查询订单"+order);
//获得订单对应的商品
System.out.println("订单的商品:" + order.getGoods());
}
运行结果:
查询商品:Goods{id=1, name='小米9手机', price=2000.0, address='上海'}
商品的订单Order{id=1, num=2, goodsId=1, time='2019-9-12'}
商品的订单Order{id=4, num=4, goodsId=1, time='2019-9-14'}
查询订单Order{id=4, num=4, goodsId=1, time='2019-9-14'}
订单的商品:Goods{id=1, name='小米9手机', price=2000.0, address='上海'}
总结
MyBatis中配置表的关联关系,需要在resultMap中配置collection或association标签
collection配置的是一对多关系,property属性是集合的名称,select配置的是查询集合的方法,column配置查询方法的参数对应的列名
association配置的是一对一关系,property属性是对应对象的名称,select配置的是查询集合的方法,column配置查询方法的参数对应的列名