1.查询多对多
需求:
查询用户购买的商品,包括用户信息,订单信息,订单详细信息,商品信息
SQL语句:
SELECT user.id,user.username,user.address, orders.iduser_orders_id,orders.number,orders.note, orderdetail.idorderdetail_id,orderdetail.items_id,orderdetail.items_num, items.nameitems_name,items.detail items_detail FROM user,orders,orderdetail,items WHERE user.id = orders.user_id AND orders.id = orderdetail.orders_id ANDorderdetail.items_id = items.id; |
修改domain类(UserMapper.java)
package cn.mybatis.mapper.domain; import java.util.List; /** * 用户的扩展类 * @author刘泽栋 * @date 2015年6月22日下午1:45:15 */ publicclass UserExt extends User { // 这里定义User类的扩展属性 // 一个用户下有多个订单 public List<OrdersExt> orders; public List<OrdersExt> getOrders(){ returnorders; } publicvoidsetOrders(List<OrdersExt>orders) { this.orders = orders; } } |
在OrdersExt类中添加List<OrderdetailExt>属性(OrdersExt.java)
publicclass OrdersExt extends Orders { /** * 添加用户的属性 */ private String username; private String sex; private String address; // 用户信息 private User user; // 订单明细 private List<OrderdetailExt> detailList; |
编写mapper接口 (UserMapper.java)
//多表查询,查询用户信息,包括订单信息,订单明细,购买商品信息 publicList<UserExt> findUserByItems(); |
编写映射文件(UserMapper.xml)
<!--定义userItemsResultMap,包括用户信息,包括订单信息,订单明细,购买商品信息 --> <resultMap type="UserExt" id="userItemsResultMap"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="address" property="address"/> <!-- 一个用户有多个订单 --> <collection property="orders" ofType="OrdersExt"> <id column="user_orders_id" property="id" /> <result column="number" property="number"/> <result column="note" property="note"/> <!-- 一个订单有多个明细 --> <collection property="detailList" ofType="OrderdetailExt"> <id column="orderdetail_id" property="id" /> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <!-- 一个订单下面有一个商品信息 --> <association property="items" javaType="items"> <id column="items_name" property="name" /> <result column="items_detail" property="detail" /> </association> </collection> </collection> </resultMap> <!-- 查询用户信息,多表查询,查询用户信息,包括订单信息,订单明细,购买商品信息 --> <select id="findUserByItems" resultMap="userItemsResultMap"> SELECT user.id,user.username,user.address, orders.id user_orders_id,orders.number,orders.note, orderdetail.idorderdetail_id,orderdetail.items_id,orderdetail.items_num, items.name items_name,items.detailitems_detail FROM user,orders,orderdetail,items WHERE user.id = orders.user_id AND orders.id = orderdetail.orders_id AND orderdetail.items_id = items.id </select> |
编写测试代码(UserMapperTest.java)
/** * 测试多表查询 * 多表查询,查询用户信息,包括订单信息,订单明细,购买商品信息 */ @Test publicvoidfindUserByItemsTest() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<UserExt> listUser = userMapper.findUserByItems(); System.out.println(listUser); sqlSession.close(); } |
小结
一对多是多对多的一个特例。
一对多的使用方式中,resultType和resultMap各自有不同的应用场景:
resultType:
查询用户名称、用户性别、用户地址、商品名称、商品价格。
resultMap:
先查询用户信息,然后鼠标移动上去,显示商品明细信息。
resultMap的嵌套查询可以使用延迟加载的功能
时间: 2024-10-10 06:59:50