请选择 进入手机版 | 继续访问电脑版

好程序员-千锋教育旗下高端IT职业教育品牌

400-811-9990
我的账户
好程序员

专注高端IT职业培训

亲爱的猿猿,欢迎!

已有账号,请

如尚未注册?

[JavaEE] 好程序员Java学习路线分享MyBatis之关联查询

[复制链接]
叶子老师 发表于 2019-9-20 15:36:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
  好程序员Java培训分享MyBatis之关联查询,我们进行数据库查询时往往需要的不止一张表的数据,需要将多张表的数据一起查询出来,大家学习过数据库的连接查询,那么在MyBatis中如何将有关系的多张表数据进行关联查询呢。
表的结构
商品和订单是典型的一对多关系,下面的案例我们将以商品表和订单表作为示例,演示如何配置最常见的一对多关系,下面是两张表的结构:
商品表:
图片3.png
订单表:
图片4.png
实体类的设计一种商品有多个订单,每个订单对应一种商品,在实体类中体现这个关系。
订单实体类:
/**
* 订单类
*/
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<Order> orders;
Mapper接口设计
这里我们只介绍关联查询,所以只定义了基本的查询方法
/**
* 商品接口
*/
public interface GoodsDAO{
    //根据编号查询商品
    Goods selectById(int id);
}
/**
* 订单接口
*/
public interface OrderDAO{
    //根据订单id查询订单
    Order selectById(int orderId);
    //根据商品id查询订单
    List<Order> selectByGoodsId(int goodsId);
}
collection标签
接下来就是重点了,我们在商品类中定义了订单集合属性orders,那么这个集合的数据如何进行查询呢?这就需要我们在mapper文件中使用collection标签。
collection标签用在resultMap标签中,用于配置集合的查询,用法是:
<collection property="集合属性名" column="传入查询方法的列名" select="查询集合所调用的方法"/>
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

<!--mapper是映射,namespace是设置对应的DAO接口-->
<mapper namespace="com.qianfeng.mybatis01.dao.GoodsDAO">
<!--配置数据库返回结果映射-->
    <resultMap id="goodsMap" type="com.qianfeng.mybatis01.entity.Goods">
        <!--id用于配置主键,property是实体类的属性名,column是表中的字段名-->
        <id property="id" column="goods_id"></id>
        <!--result配置主键外其他列-->
        <result property="name" column="goods_name"></result>
        <result property="price" column="goods_price"></result>
        <result property="address" column="goods_address"></result>
        <!--配置订单集合-->
        <collection property="orders" column="goods_id"
                    select="com.qianfeng.mybatis01.dao.OrderDAO.selectByGoodsId"/>
    </resultMap>
    <select id="selectById" parameterType="int" resultMap="goodsMap">
        select * from tb_goods where goods_id = #{id}
    </select>
</mapper>
collection的意思是:
当商品对象需要orders集合时,就会调用OrderDAOselectByGoodsId按商品id查询所有订单,商品id就是当前商品的goods_id值。
association标签
association标签的用法类似于collection,用于配置一对一的关系,每个订单中有一个商品对象goods,这个对象查询可以用association来进行配置。
用法:
<association property="对象属性名" column="传入查询方法的列名" select="查询对象所调用的方法"/>
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

<!--mapper是映射,namespace是设置对应的DAO接口-->
<mapper namespace="com.qianfeng.mybatis01.dao.OrderDAO">
    <!--配置数据库返回结果映射-->
    <resultMap id="orderMap" type="com.qianfeng.mybatis01.entity.Order">
        <!--id用于配置主键,property是实体类的属性名,column是表中的字段名-->
        <id property="id" column="order_id"></id>
        <!--result配置主键外其他列-->
        <result property="num" column="order_num"></result>
        <result property="goodsId" column="order_goods_id"></result>
        <result property="time" column="order_time"></result>
        <!--配置商品对象映射-->
        <association property="goods" column="order_goods_id"
                     select="com.qianfeng.mybatis01.dao.GoodsDAO.selectById"/>
    </resultMap>

    <select id="selectById" parameterType="int" resultMap="orderMap">
        select * from tb_order where order_id = #{id}
    </select>

    <select id="selectByGoodsId" parameterType="int" resultMap="orderMap">
        select * from tb_order where order_goods_id = #{goodsId}
    </select>
</mapper>
association的意思是:
当订单对象需要goods对象时,就调用GoodsDAOselectById按商品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中配置collectionassociation标签
collection配置的是一对多关系,property属性是集合的名称,select配置的是查询集合的方法,column配置查询方法的参数对应的列名
association配置的是一对一关系,property属性是对应对象的名称,select配置的是查询集合的方法,column配置查询方法的参数对应的列名
好程序员Java培训官网:http://www.goodprogrammer.org/

精彩内容,一键分享给更多人!
回复

使用道具 举报

您需要登录后才可以回帖

本版积分规则

关注我们
好程序员
千锋好程序员

北京校区(总部):北京市海淀区宝盛北里西区28号中关村智诚科创大厦

深圳西部硅谷校区:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619

杭州龙驰智慧谷校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层

郑州校区:郑州市二七区航海中路60号海为科技园C区10层、12层

Copyright 2007-2019 北京千锋互联科技有限公司 .All Right

京ICP备12003911号-5 京公安网11010802011455号

请您保持通讯畅通1对1咨询马上开启