zoukankan      html  css  js  c++  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。

    单元测试

    @Testpublic 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配置查询方法的参数对应的列名

  • 相关阅读:
    【转】Shell编程基础篇-上
    【转】inotify+rsync实现实时同步
    Spring
    jdk,jre,tommcat配置问题
    Java前后台开发
    前端组件学习(一)
    报表工具进阶(二)
    查询时异步刷新问题--用到了ajax
    学习jaspersoft/JasperReport
    利用SQLYog操作数据库mysql
  • 原文地址:https://www.cnblogs.com/qfchen/p/11547241.html
Copyright © 2011-2022 走看看