Mybatis学习总结四(关联查询)

一、一对一查询

实例:查询所有订单信息,关联查询下单用户信息。

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

1 public class OrdersCustom extends Orders {
2
3     private String username;// 用户名称
4     private String address;// 用户地址
5 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接口

1 public List<OrdersCustom> findOrdersList() throws Exception;

测试:

 1 Public void testfindOrdersList()throws Exception{
 2         //获取session
 3         SqlSession session = sqlSessionFactory.openSession();
 4         //获限mapper接口实例
 5         UserMapper userMapper = session.getMapper(UserMapper.class);
 6         //查询订单信息
 7         List<OrdersCustom> list = userMapper.findOrdersList();
 8         System.out.println(list);
 9         //关闭session
10         session.close();
11     }

总结:定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。

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

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

Mapper.xml

<!-- 订单信息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:表示关联查询的结果类型
<id property="id" column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。
<result property="username" column="username"/>:查询结果的username列对应关联对象的username属性。
-->

1     <select id="findOrdersListResultMap" resultMap="userordermap">
2     SELECT
3     orders.*,
4     user.username,
5     user.address
6     FROM
7     orders,    user
8     WHERE orders.user_id = user.id
9     </select>



二、一对多查询

实例:查询所有订单信息及订单下的订单明细信息。

定义po类:在Orders类中加入User属性,在Orders类中加入List<Orderdetail> 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 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中的对象类型。
<id />及<result/>的意义同一对一查询。
-->

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

1 <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap">
2 <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
3     <id property="id" column="orderdetail_id"/>
4     <result property="items_id" column="items_id"/>
5     <result property="items_num" column="items_num"/>
6 </collection>
7 </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>

原文地址:https://www.cnblogs.com/ustc-anmin/p/10480578.html

时间: 2024-10-10 21:23:01

Mybatis学习总结四(关联查询)的相关文章

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

Mybatis学习记录(四)--高级查询和缓存

这些都是连贯的学习笔记,所以有的地方因为之前都说过,所以也就没怎么写详细了,看不太明白的可以看看之前的笔记. 一.高级查询 高级查询主要是一对一查询,一对多查询,多对多查询 1.一对一查询 有用户和订单两个表,用户对订单是1对1查询.也就是订单中有一个外键是指向用户的. 先创建实体类: User.java public class User { private int id; private String username; private String password; private St

mybatis学习笔记(10)-一对一查询

mybatis学习笔记(10)-一对一查询 mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实现一对一查询小结 本文使用两种方式(resultType和resultMap)实现一对一查询,查询订单信息,关联查询创建订单的用户信息 resultType实现 sql语句 确定查询的主表:订单表 确定查询的关联表:用户表 关联查询使用内连接?还是外连接? 因为orders表中有一个外键(user_id),通过外键关联查询

MyBatis学习总结——实现关联表查询(转)

原文链接:孤傲苍狼 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUT

Mybatis框架学习(四)—查询缓存与spring的整合开发

1       项目整体目录 2       查询缓存 2.1     缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2.1    mybatis持久层缓存 mybatis提供一级缓存和二级缓存 mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mappe

MyBatis学习19-一对多查询

需求:查询订单及订单明细的信息 1.写sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一的基础之上,添加订单明细表关联即可,同时,对orders映射不能出现重复记录 select orders.*, user.username, user.sex, user.address, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id from orders, user, orderdetail whe

Mybatis学习笔记-一对一关联

Teacher.java实体类 . 对应数据库teacher表 public class Teacher { private int id; private String name; //... } Classes.java实体类 . 对应数据库class表 public class Classes { private int id; private String name; private Teacher teacher; //... } 第一种方式 <!--  方式一:嵌套结果:使用嵌套结果

mybatis映射文件select_resultMap_关联查询_collection定义关联集合

知识点:查询一个实体类,并查出这个类下面的集合 Employee.java实体类 package com.hand.mybatis.bean;public class Employee {    private Integer eId;    private String eName;    private Integer gender;    private String email;    private Department dept;        public Employee() {

mybatis collection 一对多关联查询,单边分页的问题总结!

若想直接通过sql实现多级关联查询表结构得有2 个必不可少的字段:id ,parentId,levelId id:主键id, parentId:父id levelId:表示第几级(表本身关联查询的时候需要用到,不然会有重复数据) 利用mybatis collection 实现一对多关联查询 Dto:(一级) public class ProvinceInfoDTO implements Serializable { private String id; private String name;