ssm框架学习---mybatis中一对多关系的查询

12 篇文章 0 订阅

(1)使用resultMap处理一对多关系是,将一对多,多的那部分数据用集合来存储,使用collection标签

(2)如果使用resultType来处理,需要手动去重复,然后把多的那部分关系提取出来放到一个list中

比如一个客户可能对应多个订单,如下mapper.xml文件定义如下:

<?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="com.ajin.mybatis.mapper.CustomerOrdersMapper">
    <resultMap id="CustomerOrdersMap" type="com.ajin.mybatis.model.CustomerOrdersMap" >
        <!--定义客户信息-->
        <id column="cno" property="cno"></id>
        <result column="cname" property="cname"></result>
        <result column="csex" property="csex"></result>
        <result column="cphone" property="cphone"></result>
        <result column="caddress" property="caddress"></result>
        <!-- 定义客户对应的订单信息,这里是一对多的关系,所以用到collection
           注意下面用到的ofType而不是javaType
        -->
        <collection property="orders" ofType="com.ajin.mybatis.model.Orders">
            <id column="ono" property="ono"></id>
            <result column="otime" property="otime"></result>
        </collection>
    </resultMap>

    <select id="selectCustomerOrdersMap" parameterType="int" resultMap="CustomerOrdersMap">
        select customer.*,orders.ono,orders.otime
        from customer,orders
        where customer.cno = orders.cno and customer.cno=#{value}
    </select>


</mapper>
里面将一个用户的所有订单封装到一个collection中,对应的返回类型定义如下:

import java.util.List;

/**
 * Created by ajin on 16-12-19.
 */
public class CustomerOrdersMap extends Customer {
    private List<Orders> orders;

    public List<Orders> getOrders() {
        return orders;
    }

    public void setOrders(List<Orders> orders) {
        this.orders = orders;
    }
}
它继承自Customer,并增加了一个list用来保存所有订单,

对应mapper接口的定义如下:

package com.ajin.mybatis.mapper;

import com.ajin.mybatis.model.CustomerOrdersMap;

/**
 * Created by ajin on 16-12-19.
 */
public interface CustomerOrdersMapper {
    public CustomerOrdersMap selectCustomerOrdersMap(int id);
}
最终编写我们的测试用例:

package com.ajin.mybatis.mapper;

import com.ajin.mybatis.model.CustomerOrdersMap;
import com.ajin.mybatis.model.OrdersCustomer;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;

import static org.junit.Assert.*;

/**
 * Created by ajin on 16-12-19.
 */
public class CustomerOrdersMapperTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception {
        String resource = "config/SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void selectCustomerOrdersMap() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            CustomerOrdersMapper customerOrdersMapper = sqlSession.getMapper(CustomerOrdersMapper.class);
            CustomerOrdersMap customerOrdersMap=customerOrdersMapper.selectCustomerOrdersMap(1);
            System.out.println(customerOrdersMap);
        }finally {
            sqlSession.close();
        }
    }

}

本来依据mapper.xml配置文件中的select语句会查询出关于某个用户的所有订单信息,会返回多条记录,但是这些记录中的用户信息都是公共的,因此可以使用一个对象,将不同的Orders部分作为一个list属性,放到这个新的对象中,使得最终执行该方法返回一个对象,并包含所有的订单记录

一般情况下:如果对于查询结果没有特殊要求的话,采用一个pojo来使用resultType返回就可以了,

如果需要比如说展开等情况对返回结果有一定的要求,需要使用resultMap来返回结果,

对于多对多的关系,就是可能在collection里面继续套collection,或者里面继续嵌套association等,都是一个原理,上面使用resultMap中,我新建了pojo,主要目的是当我们用mybatis的自动生成工具时,避免污染单表的在重新自动生成时,污染之前写过的代码,因此使用了基于继承的pojo来保存返回结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值