Mybatis学习笔记(九)——一对一和一对多查询

本博客源码下载:戳我一下

Mybatis学习笔记汇总:戳我一下

一对一查询

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

注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

方法一:

使用resultType,定义订单信息pojo类,此pojo类中包括了订单信息和用户信息。
1、先写sql语句

SELECT 
  orders.*,
  user.username,
  user.address
FROM
  orders,
  user 
WHERE orders.user_id = user.id

2、写一个pojp类

public class OrdersCustom extends Orders {

    private String username;// 用户名称
    private String address;// 用户地址
    get和set方法省略
}

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

3、配置Mapper.xml

<!-- 查询所有订单信息 -->
<select id="findOrdersList" resultType="com.jiayifan.po.OrdersCustom">
        SELECT
        orders.*,
        user.username,
        user.address
        FROM
        orders, user
        WHERE orders.user_id = user.id 
</select>

4、写Mapper接口

public List<OrdersCustom> findOrdersList() throws Exception;

5、测试

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

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

方法二:

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

1、sql语句与方法一相同

2、定义pojo类

public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //用户信息
    private User user;
    getset方法省略
 }

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

    <!-- 订单信息resultmap -->
    <resultMap type="com.jiayifan.po.Orders" id="userordermap">
        <!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 -->
        <id property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="number" column="number"/>
        <association property="user" javaType="com.jiayifan.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:表示关联查询的结果存储在com.jiayifan.po.Ordersuser属性中
javaType:表示关联查询的结果类型
<id property="id" column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。
<result property="username" column="username"/>:查询结果的username列对应关联对象的username属性。
4、配置Mapper.xml

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

5、Mapper接口

public List<Orders> findOrdersListResultMap() throws Exception;

6、测试

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

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

一对多查询

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

订单信息与订单明细为一对多关系。使用resultMap实现如下:
1、写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

2、定义pojo类

public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //用户信息
    private User user;

    //订单明细
    private List<Orderdetail> orderdetails;
    getset方法省略
 }

3、定义resultMap

<!-- 订单信息resultmap -->
<resultMap type="com.jiayifan.po.Orders" id="userorderdetailmap">
    <id property="id" column="id"/>
    <result property="userId" column="user_id"/>
    <result property="number" column="number"/>
    <association property="user" javaType="com.jiayifan.po.User">
        <id property="id" column="user_id"/>
        <result property="username" column="username"/>
        <result property="address" column="address"/>
    </association>
    <collection property="orderdetails" ofType="com.jiayifan.po.Orderdetail">
        <id property="id" column="orderdetail_id"/>
        <result property="itemsId" column="items_id"/>
        <result property="itemsNum" column="items_num"/>
    </collection>
</resultMap>

collection部分定义了查询订单明细信息。
collection:表示关联查询结果集
property="orderdetails":关联查询的结果集存储在com.jiayifan.po.Orders上那个属性。
ofType="cn.itcast.mybatis.po.Orderdetail":指定关联查询的结果集中的对象类型即List中的对象类型。
<id /><result/>的意义同一对一查询。

这里发现配置文件中的上半部分和一对一查询时的配置文件相同,这时我们可以使用resultMap的继承方法

    <resultMap type="com.jiayifan.po.Orders" id="userorderdetailmap" extends="com.jiayifan.mapper.OneToOneMapper.userordermap">
        <collection property="orderdetails" ofType="com.jiayifan.po.Orderdetail">
            <id property="id" column="orderdetail_id"/>
            <result property="itemsId" column="items_id"/>
            <result property="itemsNum" column="items_num"/>
        </collection>
    </resultMap>

使用extends继承订单信息userordermap
4、Mapper接口:

public List<Orders> findOrdersDetailList () throws Exception;

5、测试

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

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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页