一、一对一
1、resultType返回类型:使用resultType返回相对简单,查询扩展类属性时,创建扩展类。
2、resultMap返回类型:使用resultMap首先需要将1:1关联实体例如订单关联查询用户是一对一关系,所以在Order实体中添加单个User对象存储关联查询的用户信息。
1)Order Pojo中添加private User user;
2)定义resultMap
需要关联查询映射的是用户信息,使用association将用户信息映射到订单对象的用户属性中。
<!-- 订单信息resultmap --> <resultMap type="cn.itcast.mybatis.po.Orders" id="userordermap"> <!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 --> <id property="id" column="id"/> <result property="user_id" column="user_id"/> <result property="number" column="number"/> <association property="user" javaType="cn.itcast.mybatis.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>a ssociation : 表示进行关联查询单条记录
property:表示关联查询的结果存储在cn.itcast.mybatis.po.Orders的user属性中
javaType:表示关联查询的结果类型
<id property="id" column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。
<result property="username" column="username"/>:查询结果的username列对应关联对象的username属性。
3)Mapper映射
<select id="findOrdersListResultMap" resultMap="userordermap"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>4)mapper.java接口
public List<Orders> findOrdersListResultMap() throws Exception;5)测试
Public void testfindOrdersListResultMap()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //查询订单信息 List<Orders> list = userMapper.findOrdersList2(); System.out.println(list); //关闭session session.close(); }二、一对多
1、Order 实体中添加OrderDetail的List实体集
在Orders类中加入List<Orderdetail> orderdetails属性
2、定义ResultMap
<!-- 订单信息resultmap --> <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap"> <id property="id"column="id"/> <result property="user_id" column="user_id"/> <result property="number" column="number"/> <association property="user" javaType="cn.itcast.mybatis.po.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="items_id" column="items_id"/> <result property="items_num" column="items_num"/> </collection> </resultMap>resultMap的 继承:
如果应用到User的实体关联查询,上边一对一查询订单及用户信息定义的resultMap相同,可以省去association关联,将用户中定义的resultMap直接套用继承,优化如下:
<resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap"> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="items_id" column="items_id"/> <result property="items_num" column="items_num"/> </collection> </resultMap> //使用extends="userordermap" 继承userodermap
3、Mapper映射
<select id="findOrdersDetailList" resultMap="userorderdetailmap"> 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 </select>总结: 使用 collection 完成一对多关联查询,将关联查询信息映射到集合对象。
在Mybaits中,一对多查询是多对多查询的特例,1:n中使用一个collectin元素完成关联映射,而n:n中使用collection嵌套,表示多条记录映射到多条查询。例如用户关联订单、订单详情、商品信息
1、pojo扩展
在User中添加List<Orders> orders 属性,在Orders类中加入List<Orderdetail> orderdetails属性
2、定义ResultMap
<pre name="code" class="html"> <resultMap type="cn.itcast.mybatis.po.User" id="userOrderListResultMap"> <id column="user_id" property="id"/> <result column="username" property="username"/> <collection property="orders" ofType="cn.itcast.mybatis.po.Orders"> <id column="id" property="id"/> <result property="number" column="number"/> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id column="orderdetail_id" property="id"/> <result property="ordersId" column="id"/> <result property="itemsId" column="items_id"/> <result property="itemsNum" column="items_num"/> <association property="items" javaType="cn.itcast.mybatis.po.Items"> <id column="items_id" property="id"/> <result column="items_name" property="name"/> <result column="items_detail" property="detail"/> </association> </collection> </collection> </resultMap>在订单collection中添加订单详情collection表示订单与订单详情的多对多关系。