ITPub博客

首页 > 应用开发 > Java > 好程序员Java学习路线分享MyBatis之关联查询

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

原创 Java 作者:好程序员IT 时间:2019-09-23 14:23:22 0 删除 编辑

  好程序员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<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"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--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 集合时,就会调用 OrderDAO 的 selectByGoodsId 按商品 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"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--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 对象时,就调用 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 配置查询方法的参数对应的列名

 

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913892/viewspace-2657923/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
欢迎关注公众号:好程序员特训营 web前端教程分享 723729549 大数据教程分享 703503210

注册时间:2019-03-20

  • 博文量
    539
  • 访问量
    410804