6、ssm之关联查询

ssm之关联查询

一对一查询

方法一

使用 resultType,定义订单信息 po 类,此 po 类中包括了订单信息和用户信息

sql语句
SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id=user.id
定义 po 类

OrdersCustom 类继承 Orders 类后 OrdersCustom 类包括了 Orders 类的所有字段,只需要定义 用户的信息字段即可。

public class OrdersCustom extends Orders {
	private String username;// 用户名称 
    private String address;// 用户地址 
    get/set...
}
Mapper.xml
<!-- 查询所有订单信息 --> 
<select id="findOrdersList" resultType="cn.itcast.mybatis.po.OrdersCustom"> 
    SELECT orders.*, user.username, user.address FROM orders,user WHERE orders.user_id = user.id 
</select>
Mapper 接口
public List<OrdersCustom> findOrdersList() throws Exception;
测试
public void testfindOrdersList()throws Exception{ 
    //获取session 
    SqlSession session = sqlSessionFactory.openSession(); 
    //获限mapper接口实例 
    UserMapper userMapper = session.getMapper(UserMapper.class); 
    //查询订单信息 
    List<OrdersCustom> list = userMapper.findOrdersList(); 
    System.out.println(list); 
    //关闭session 
    session.close(); 
}

定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。此方法较为简单和常用。

方法二

使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。

sql语句
SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id=user.id
定义 po 类

在 Orders 类中加入 User 属性,user 属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个 User 对象存储关联查询的用户信息。

Mapper.xml
<select id="findOrdersListResultMap" resultMap="userordermap"> 
    SELECT orders.*, user.username, user.address FROM orders,user WHERE orders.user_id = user.id 
</select>

这里 resultMap 指定 userordermap 。

定义 resultMap

需要关联查询映射的是用户信息,使用 association 将用户信息映射到订单对象的用户属性中。

<!-- 订单信息resultmap --> 
<resultMap type="cn.itcast.mybatis.po.Orders" id="userordermap"> 
    <!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用, 必须写 --> 
    <id property="id" column="id"/> 
    <result property="user_id" column="user_id"/> 
    <result property="number" column="number"/> 
    <association property="user" javaType="cn.itcast.mybatis.po.User"> 
        <!-- 这里的id为user的id,如果写上表示给user的id属性赋值 --> 
        <id property="id" column="user_id"/> 
        <result property="username" column="username"/> 
        <result property="address" column="address"/> 
    </association> 
</resultMap> 

association:表示进行关联查询单条记录
property:表示关联查询的结果存储在 cn.itcast.mybatis.po.Orders 的 user 属性中
javaType:表示关联查询的结果类型
:查询结果的 user_id 列对应关联对象的 id 属性,这里是表示 user_id 是关联查询对象的唯一标识。
:查询结果的 username 列对应 关联对象的 username 属性。

Mapper 接口
public List<Orders> findOrdersListResultMap() throws Exception;
测试
public void testfindOrdersListResultMap()throws Exception{ 
    //获取session 
    SqlSession session = sqlSessionFactory.openSession(); 
    //获限mapper接口实例 
    UserMapper userMapper = session.getMapper(UserMapper.class); 
    //查询订单信息 
    List<Orders> list = userMapper.findOrdersList2(); 
    System.out.println(list);
    //关闭session 
    session.close();
}

使用 association 完成关联查询,将关联查询信息映射到 pojo 对象中。

一对多查询

使用 resultMap 实现

Sql 语句

SELECT orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num 
FROM orders,user,orderdetail
WHERE orders.user_id=user.id AND orders.id=orderdetail.orders_id

定义 po 类

在 Orders 类中加入 User 属性。
在 Orders 类中加入 List orderdetails 属性

Mapper.xml

<select id="findOrdersDetailList" resultMap="userorderdetailmap"> 
    SELECT orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num FROM orders,user,orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id 
</select>

定义 resultMap

<!-- 订单信息resultmap --> 
<resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap"> 
    <!-- 黄色部分 -->
    <id property="id"column="id"/> 
    <result property="user_id" column="user_id"/> 
    <result property="number" column="number"/> 
    <association property="user" javaType="cn.itcast.mybatis.po.User"> 
        <id property="id" column="user_id"/> 
        <result property="username" column="username"/> 
        <result property="address" column="address"/> 
    </association> 
    <!-- 黄色部分 -->
    <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> 
        <id property="id" column="orderdetail_id"/> 
        <result property="items_id" column="items_id"/> 
        <result property="items_num" column="items_num"/> 
    </collection> 
</resultMap>

注释中黄色部分括起来的部分和上边一对一查询订单及用户信息定义的 resultMap 相同,
collection 部分定义了查询订单明细信息。
collection:表示关联查询结果集
property=“orderdetails” : 关联查询的结果集存储在 cn.itcast.mybatis.po.Orders 上哪个属性。
ofType=“cn.itcast.mybatis.po.Orderdetail” : 指定关联查询的结果集中的对象类型即 List 中的对象类型。
及的意义同一对一查询。

resultMap 使用继承

上边定义的 resultMap 中黄色部分和一对一查询订单信息的 resultMap 相同,这里使用继承可以不再填写重复的内容

<resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap"> 
    <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> 
        <id property="id" column="orderdetail_id"/> 
        <result property="items_id" column="items_id"/> 
        <result property="items_num" column="items_num"/> 
    </collection> 
</resultMap>

使用 extends 继承订单信息 userordermap 。

Mapper 接口

public List<Orders>findOrdersDetailList() throws Exception;

测试

Public void testfindOrdersDetailList()throws Exception{ 
    //获取session 
    SqlSession session = sqlSessionFactory.openSession(); 
    //获限mapper接口实例 
    UserMapper userMapper = session.getMapper(UserMapper.class); 
    //查询订单信息
    List<Orders> list = userMapper.findOrdersDetailList(); 
    System.out.println(list); 
    //关闭session 
    session.close();
}

使用 collection 完成关联查询,将关联查询信息映射到集合对象。

多对多查询

sql

需要查询所有用户信息,关联查询订单及订单明细信息,订单明细信息中关联查询商品信息

SELECT orders.*, USER.username, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, items.nameitems_name, items.detailitems_detail 
FROM orders, USER, orderdetail, items 
WHERE orders.user_id=USER.id AND orders.id=orderdetail.orders_id AND orderdetail.items_id=items.id

po 定义

在 User 中 添 加 List orders 属 性 , 在 Orders 类 中 加 入 List orderdetails 属性

resultMap

需要关联查询映射的信息是:订单、订单明细、商品信息
订单:一个用户对应多个订单,使用 collection 映射到用户对象的订单列表属性中
订单明细:一个订单对应多个明细,使用 collection 映射到订单对象中的明细属性中
商品信息:一个订单明细对应一个商品,使用 association 映射到订单明细对象的商品属性中。

<!-- 一对多查询 查询用户信息、关联查询订单、订单明细信息、商品信息 --> 
<resultMap type="cn.itcast.mybatis.po.User" id="userOrderListResultMap"> 
    <id column="user_id" property="id"/> 
    <result column="username" property="username"/> 
    <collection property="orders" ofType="cn.itcast.mybatis.po.Orders"> 
        <id column="id" property="id"/> 
        <result property="number" column="number"/> 
        <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> 
            <id column="orderdetail_id" property="id"/> 
            <result property="ordersId" column="id"/> 
            <result property="itemsId" column="items_id"/> 
            <result property="itemsNum" column="items_num"/> 
            <association property="items" javaType="cn.itcast.mybatis.po.Items"> 
                <id column="items_id" property="id"/> 
                <result column="items_name" property="name"/> 
                <result column="items_detail" property="detail"/> 
            </association> 
        </collection> 
    </collection>
</resultMap>

小结

resultType:
作用: 将查询结果按照 sql 列名 pojo 属性名一致性映射到 pojo 中。
场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用 resultType 将每一条记录映射到 pojo 中,在前端页面遍历 list(list 中是 pojo)即可。

resultMap: 使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

association:
作用: 将关联查询信息映射到一个 pojo 对象中。
场合: 为了方便查询关联信息可以使用 association 将关联订单信息映射为用户对象的 pojo 属性中,比如:查询订单及关联用户信息。 使用 resultType 无法将查询结果映射到 pojo 对象的 pojo 属性中,根据对结果集查询遍历的需要选择使用 resultType 还是 resultMap。

collection:
作用: 将关联查询信息映射到一个 list 集合中。
场合:为了方便查询遍历关联信息可以使用 collection 将关联信息映射到 list 集合中,比如:查询用户权限范围模块及模块下的菜单,可使用 collection 将模块映射到模块 list 中,将菜单列表映射到模块对象的菜单 list 属性中,这样的作的目的也是方便对查询结果集进行遍历查询。 如果使用 resultType 无法将查询结果映射到 list 集合中。


本篇文章参考书籍有:
《传智播客 mybatis 框架课程讲义》 燕青


作者:阿涛
CSDN博客主页:https://blog.csdn.net/qq_43313113
如有不对的地方,欢迎在评论区指正
欢迎大家关注我,我将持续更新更多的文章


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值