1.1 一对多查询
案例:查询所有订单信息及订单下的订单明细信息。
订单信息与订单明细为一对多关系。
使用resultMap实现如下:
1.1.1 Sql语句:三张表的关联查询 标红的分别为查询字段,查询的表,关联查询的条件
orders.*,
user.username,
user.address,
orderdetail.idorderdetail_id,
orderdetail.items_id,
orderdetail.items_num
FROM
orders, user, orderdetail
WHEREorders.user_id = user.id
AND orders.id = orderdetail.orders_id
1.1.2 定义po类 orderdetails 用来一对多的映射订单明细信息,明细信息映射到orderdetails集合中去
在Orders类中加入User属性。
在Orders类中加入List<Orderdetail> orderdetails属性
1.1.3 Mapper.xml
<selectid="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>
1.1.4 定义resultMap association一对一映射collection一对多映射 cn.itcast.mybatis.po.Orders 查询主体 <id/>为关联查询的条件,既唯一标识; <result/>为查询的字段
<!-- 订单信息resultmap -->
<resultMaptype="cn.itcast.mybatis.po.Orders"id="userorderdetailmap">
<idproperty="id"column="id"/>
<resultproperty="user_id"column="user_id"/>
<resultproperty="number"column="number"/>
<association property="user"javaType="cn.itcast.mybatis.po.User">
<idproperty="id"column="user_id"/>
<resultproperty="username"column="username"/>
<resultproperty="address"column="address"/>
</association>
<collection property="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">
<idproperty="id"column="orderdetail_id"/>
<resultproperty="items_id"column="items_id"/>
<resultproperty="items_num"column="items_num"/>
</collection>
</resultMap>
collection部分定义了查询订单明细信息。
collection:表示关联查询结果集
property="orderdetails":关联查询的结果集存储在cn.itcast.mybatis.po.Orders上哪个属性。
ofType="cn.itcast.mybatis.po.Orderdetail":指定关联查询的结果集中的对象类型即List中的对象类型。
<id />及<result/>的意义同一对一查询。
1.1.4.1 resultMap使用继承
上边定义的resultMap中黄色部分和上一篇博客一对一查询订单信息的resultMap相同,在同一工程里使用继承可以不再填写重复的内容,如下:
<resultMaptype="cn.itcast.mybatis.po.Orders"id="userorderdetailmap"extends="userordermap">
<collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">
<idproperty="id"column="orderdetail_id"/>
<resultproperty="items_id"column="items_id"/>
<resultproperty="items_num"column="items_num"/>
</collection>
</resultMap>
使用extends继承订单信息userordermap。
1.1.5 Mapper接口:
public List<Orders>findOrdersDetailList() throws Exception;
1.1.6 测试:
Public void testfindOrdersDetailList()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//查询订单信息
List<Orders> list = userMapper.findOrdersDetailList();
System.out.println(list);
//关闭session
session.close();
}
1.2 多对多查询
1.2.1.1 需求
查询用户购买的商品信息。
1.2.1.2 sql
需要查询所有用户信息,关联查询订单及订单明细信息,订单明细信息中关联查询商品信息
四张表表的关联查询
SELECT
orders.*,
USER.username,
USER.address,
orderdetail.idorderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
items.nameitems_name,
items.detailitems_detail
FROM
orders,
USER,
orderdetail,
items
WHERE
orders.user_id =USER .id
AND orders.id = orderdetail.orders_id
AND orderdetail.items_id = items.id
1.2.1.3 po定义
在User中添加List<Orders> orders 属性,在Orders类中加入List<Orderdetail> orderdetails属性
1.2.1.4 resultMap
需要关联查询映射的信息是:订单、订单明细、商品信息
订单:一个用户对应多个订单,使用collection映射到用户对象的订单列表属性中
订单明细:一个订单对应多个明细,使用collection映射到订单对象中的明细属性中
商品信息:一个订单明细对应一个商品,使用association映射到订单明细对象的商品属性中。
思路:
将用户信息映射到user中。
在user类中添加订单列表属性List<Orders> orderslist,将用户创建的订单映射到orderslist
在Orders中添加订单明细列表属性List<OrderDetail>orderdetials,将订单的明细映射到orderdetials
在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items
<!-- 一对多查询
查询用户信息、关联查询订单、订单明细信息、商品信息
-->
<resultMap type="cn.itcast.mybatis.po.User"id="userOrderListResultMap">
<idcolumn="user_id"property="id"/>
<resultcolumn="username"property="username"/>
<collectionproperty="orders"ofType="cn.itcast.mybatis.po.Orders">
<id column="id"property="id"/>
<resultproperty="number"column="number"/>
<collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">
<id column="orderdetail_id"property="id"/>
<resultproperty="ordersId"column="id"/>
<resultproperty="itemsId"column="items_id"/>
<resultproperty="itemsNum"column="items_num"/>
<associationproperty="items"javaType="cn.itcast.mybatis.po.Items">
<idcolumn="items_id"property="id"/>
<resultcolumn="items_name"property="name"/>
<resultcolumn="items_detail"property="detail"/>
</association>
</collection>
</collection>
</resultMap>
1.2.1.5 mapper.Xml
<!-- 查询用户及购买的商品信息 -->
<selectid="findUserAndItemsResultMap"resultMap="UserAndItemsResultMap">
SELECTorders.* ,
user.username, user.sex , user.address ,
orderdetail.orders_id, orderdetail.items_id , orderdetail.items_num , orderdetail.id orderdetail_id,
items.nameitems_name , items.detail items_detail , items.price items_price
FROM orders ,USER , orderdetail , items
WHEREorders.user_id=user.id AND orderdetail.orders_id = orders.id AND orderdetail.items_id=items.id
</select>
1.2.1.6 mapper接口
//查询用户购买的商品信息
public List<User> findUserAndItemsResultMap()throwsxception;
1.2.1.7 测试通过resultMap去重打印
//查询用户购买的商品信息
@Test
public voidtestFindUserAndItemsResultMap() throwsException{
SqlSessionsqlSession=sqlSessionFactory.openSession();
OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
List<User>list=ordersMapperCustom.findUserAndItemsResultMap();
Stringresult="";
for(inti=0;i<list.size();i++)
{
result="用户 "+list.get(i).getUsername();
for(intj=0;j<list.get(i).getOrderList().size();j++)
{
result=result+"订单id "+list.get(i).getOrderList().get(j).getId();
for(intk=0;k<list.get(i).getOrderList().get(j).getOrderdetails().size();k++)
{
result=result+" "+list.get(i).getOrderList().get(j).getOrderdetails().get(k).getItems().getName()+"价格 "+
+list.get(i).getOrderList().get(j).getOrderdetails().get(k).getItems().getPrice();
}
}
System.out.println(result);//去重
}
sqlSession.close();
}
总结自传智博客燕青老师的视频