ssm框架学习---mybatis中一对多关系的查询
2016-12-19 19:57
295 查看
(1)使用resultMap处理一对多关系是,将一对多,多的那部分数据用集合来存储,使用collection标签
(2)如果使用resultType来处理,需要手动去重复,然后把多的那部分关系提取出来放到一个list中
比如一个客户可能对应多个订单,如下mapper.xml文件定义如下:
对应mapper接口的定义如下:
本来依据mapper.xml配置文件中的select语句会查询出关于某个用户的所有订单信息,会返回多条记录,但是这些记录中的用户信息都是公共的,因此可以使用一个对象,将不同的Orders部分作为一个list属性,放到这个新的对象中,使得最终执行该方法返回一个对象,并包含所有的订单记录
一般情况下:如果对于查询结果没有特殊要求的话,采用一个pojo来使用resultType返回就可以了,
如果需要比如说展开等情况对返回结果有一定的要求,需要使用resultMap来返回结果,
对于多对多的关系,就是可能在collection里面继续套collection,或者里面继续嵌套association等,都是一个原理,上面使用resultMap中,我新建了pojo,主要目的是当我们用mybatis的自动生成工具时,避免污染单表的在重新自动生成时,污染之前写过的代码,因此使用了基于继承的pojo来保存返回结果。
(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来保存返回结果。
相关文章推荐
- 【SSM-MyBatis框架】关联查询--多对多查询
- SSM框架(Spring Spring MVC Mybatis)基础入门学习3——Mybits入门实例(实例免费下载!)
- SSM框架之MyBatis(二)--多表查询及查询结果映射
- 框架学习系列 mybatis 第五篇 mybatis入门程序之需求开发2根据用户名模糊查询
- SSM框架学习之(三)Mybatis——SqlMapConfig配置文件
- ssm框架学习01--mybatis学习
- ssm框架学习---mybatis中动态sql中的foreach片段
- SSM(Spring+SpringMVC+MyBatis)框架学习心路历程【二】
- ssm框架学习---mybatis中延迟加载实现
- Maven学习笔记(五)-Maven整合SSM(spring+springMVC+Mybatis)框架
- ssm框架学习03--springmvc和mybatis整合
- ssm框架学习---mybatis中动态sql中的if片段
- 23、SSM框架-Mybatis基于注解实现增删查改和多参数列表查询(5)
- SSM框架学习之(一)Mybatis——原始Dao开发
- 【SSM-MyBatis框架】关联查询--一对一查询
- Mybatis框架学习(四)—查询缓存与spring的整合开发
- ssm框架学习---mybatis单独使用各个文件编写
- ssm框架学习---mybatis中复杂输入输出的处理
- SSM-MyBatis框架关联查询实例二
- SSM框架学习之(二)Mybatis——mapper开发