(1)使用resultMap处理一对多关系是,将一对多,多的那部分数据用集合来存储,使用collection标签
(2)如果使用resultType来处理,需要手动去重复,然后把多的那部分关系提取出来放到一个list中
比如一个客户可能对应多个订单,如下mapper.xml文件定义如下:
select customer.*,orders.ono,orders.otime
from customer,orders
where customer.cno = orders.cno and customer.cno=#{value}
里面将一个用户的所有订单封装到一个collection中,对应的返回类型定义如下:
import java.util.List;
/**
* Created by ajin on 16-12-19.
*/
public class CustomerOrdersMap extends Customer {
private List orders;
public List getOrders() {
return orders;
}public void setOrders(List 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来保存返回结果。
【SSM|ssm框架学习---mybatis中一对多关系的查询】
推荐阅读
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- 框架|Mybatis的一级缓存和二级缓存
- Mybatis知识小汇(7)——使用注解开发
- Mybatis日志工厂
- MyBatis的功能架构是怎样的
- Mybatis入门之CRUD
- mybatis之缓存机制
- Mybatis练习(1)
- Java|MyBatis(五)——MyBatis中的缓存机制
- mybatis之脚本解析器