这里有新鲜出炉的MyBatis教程,程序狗速度看过来!
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
本篇文章主要介绍了mybatis高级映射一对多查询实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
1.需求分析:
在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明细信息
2.sql语句实现
2.1确定主查询表:订单表
2.2确定关联查询表:用户表, 订单明细表
sql语句如下:
- select
- orders.*,
- t_user.address,
- t_user.name,
- t_user.brithday,
- orderdetail.id orderdetail_id,
- orderdetail.orderid,
- orderdetail.itemsid
- from
- orders,
- t_user,
- orderdetail
- where
- orders.userid=t_user.id AND orderdetail.orderid=orders.id;
查询结果如下:
映射要求:
不能出现重复的订单信息
3.编码实现
在orders.java中添加属性,List<OrdersDetail> ordersDetails 。类比hibernate学习,代码如下:
- public class Orders {
- private int id;
- private String note;
- private Date dateTime;
- private String number;
- private int userId;
- private User user;
- private List < OrdersDetail > ordersDetails; //看这里
- }
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders的ordersDetails集合中,从上面查询结果图中可以看出最终的订单信息将为2条(orders信息不重复),每个订单orders中的属性存储了该订所对应的订单明细。
4.编写mapper.java和mapper.xml文件
代码如下:
- package com.djp.config.mapper;
- import com.djp.pojo.Orders;
- import com.djp.pojo.OrdersCustom;
- import java.util.List;
- public interface OrdersCustomMapper {
- /**
- * 查询订单关联查询用户信息和订单明细信息
- *
- * @return
- */
- List < Orders > findOrderAndOrderDetailResultMap();
- /**
- * 查询订单关联查询用户信息
- *
- * @return
- */
- List < OrdersCustom > findOrderUser() throws Exception;
- /**
- * 使用resultMap映射
- *
- * @return
- * @throws RuntimeException
- */
- List < Orders > findOrderUserResultMap() throws RuntimeException;
- }
对于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.djp.config.mapper.OrdersCustomMapper">
- <!--订单查询关联用户和订单明细的信息的resultMap-->
- <resultMap id="orderAndOrderDetailResultMap" type="orders" extends="ordersUserResultMap">
- <!--配置订单信息 使用继承下面的-->
- <!--配置订单关联的用户信息 使用继承下面的-->
- <!--配置订单关联的订单明细信息
- 一条订单关联查询出了多条明细,要使用collection进行映射
- collection :对关联查询到多条记录映射到集合中
- property:将关联查询到的多条记录映射到com.djp.pojo.Orders中的哪个属性
- ofType:指定映射到list集合属性中的pojo的类型
- -->
- <collection property="ordersDetails" ofType="OrdersDetail">
- <!--
- id:订单明细的唯一标示
- property:将订单明细的唯一标示映射到com.djp.pojo.OrdersDetail中的哪个属性
- -->
- <id column="orderdetail_id" property="id"/>
- <result column="orderid" property="orderId"/>
- <result column="itemsid" property="itemsId"/>
- </collection>
- </resultMap>
- <!--查询订单明细关联查询用户信息和订单明细信息的statement-->
- <select id="findOrderAndOrderDetailResultMap" resultMap="orderAndOrderDetailResultMap">
- select
- orders.*,
- t_user.address,
- t_user.name,
- t_user.brithday,
- orderdetail.id orderdetail_id,
- orderdetail.orderid,
- orderdetail.itemsid
- from
- orders,
- t_user,
- orderdetail
- where
- orders.userid=t_user.id AND orderdetail.orderid=orders.id
- </select>
- <!--订单查询关联用户的resultMap
- 将整个查询结果映射到com.djp.pojo.Orders中
- -->
- <resultMap id="ordersUserResultMap" type="com.djp.pojo.Orders">
- <!--配置映射的订单信息
- result:普通列
- id:指定查询列中的唯一标示,订单信息中的唯一标示,如果有多个列组成多个唯一标示,配置多个id
- column:订单信息的唯一标示
- property:订单信息的唯一标示,列所映射到Orders中的哪个属性
- -->
- <id column="id" property="id"/>
- <result column="note" property="note"/>
- <result column="dateTime" property="dateTime"/>
- <result column="number" property="number"/>
- <result column="userId" property="userId"/>
- <!--配置订单关联的用户信息
- association:用于映射关联查询单个用户的信息
- property:将要关联查询的用户信息映射到orders中的哪个属性
- javaType:指定的类型,可以使用别名
- -->
- <association property="user" javaType="user">
- <!--
- id :关联查询用户的唯一标示
- column:指定表示用户信息的列
- property:对应user.java中的哪个属性
- -->
- <id column="id" property="id"/>
- <result column="name" property="name"/>
- <result column="pwd" property="pwd"/>
- <result column="address" property="address"/>
- <result column="brithday" property="brithday"/>
- </association>
- </resultMap>
- <!-- 查询订单关联查询用户信息 使用resultMap-->
- <select id="findOrderUserResultMap" resultMap="ordersUserResultMap">
- select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
- </select>
- <!--查询订单关联查询用户信息-->
- <select id="findOrderUser" resultType="OrdersCustom">
- select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
- </select>
- </mapper>
代码有点多,不怕得,下面的是之前的一对一的,注意继承至之前写好的resultMap。
5 写测试代码:
- /**
- * 查询订单关联查询用户信息和订单明细信息
- */
- @Test public void testFindOrderAndOrderDetailResultMap() {
- try {
- System.out.println("start.................");
- //通过得到的SqlSessionFactory打开回话sqlSession
- SqlSession sqlSession = SqlSessionFactory.openSession();
- //通过会话得到用户的代理
- OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper.class);
- List < Orders > list = ordersCustomMapper.findOrderAndOrderDetailResultMap();
- for (Orders item: list) {
- System.out.println("订单+用户+订单明细:" + item);
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
运行结果如下:
从图中可看出我们需要的订单信息,关联查询出的用户信息,关联查询出的订单明细信息都出来了!
6 .总结
mybatis使用resultMap实现一对多查询用collection对关联查询出的多条记录映射到一个list集合中
来源: http://www.phperz.com/article/17/1209/357569.html