一、一对一查询
实例:查询所有订单信息,关联查询下单用户信息。
Method1:使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息。
1 public class OrdersCustom extends Orders { 2 3 private String username;// 用户名称 4 private String address;// 用户地址 5 get/set。。。。
Mapper.xml
<!-- 查询所有订单信息 --> <select id="findOrdersList" resultType="cn.itcast.mybatis.po.OrdersCustom"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
Mapper接口
1 public List<OrdersCustom> findOrdersList() throws Exception;
测试:
1 Public void testfindOrdersList()throws Exception{ 2 //获取session 3 SqlSession session = sqlSessionFactory.openSession(); 4 //获限mapper接口实例 5 UserMapper userMapper = session.getMapper(UserMapper.class); 6 //查询订单信息 7 List<OrdersCustom> list = userMapper.findOrdersList(); 8 System.out.println(list); 9 //关闭session 10 session.close(); 11 }
总结:定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。
Method2:使用resultMap,定义专门的resultMap用于映射一对一查询结果。
tips:在Orders类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。
Mapper.xml
<!-- 订单信息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> <!-- association:表示进行关联查询单条记录 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属性。 -->
1 <select id="findOrdersListResultMap" resultMap="userordermap"> 2 SELECT 3 orders.*, 4 user.username, 5 user.address 6 FROM 7 orders, user 8 WHERE orders.user_id = user.id 9 </select>
二、一对多查询
实例:查询所有订单信息及订单下的订单明细信息。
定义po类:在Orders类中加入User属性,在Orders类中加入List<Orderdetail> orderdetails属性。
Mapper.xml
<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> <!-- 订单信息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相同, collection部分定义了查询订单明细信息。 collection:表示关联查询结果集 property="orderdetails":关联查询的结果集存储在cn.itcast.mybatis.po.Orders上哪个属性。 ofType="cn.itcast.mybatis.po.Orderdetail":指定关联查询的结果集中的对象类型即List中的对象类型。 <id />及<result/>的意义同一对一查询。 -->
tips:上边定义的resultMap中黄色部分和一对一查询订单信息的resultMap相同,这里使用继承可以不再填写重复的内容,如下:
1 <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap"> 2 <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> 3 <id property="id" column="orderdetail_id"/> 4 <result property="items_id" column="items_id"/> 5 <result property="items_num" column="items_num"/> 6 </collection> 7 </resultMap>
三、多对多查询
案例:需要关联查询映射的信息是:订单、订单明细、商品信息;订单:一个用户对应多个订单,使用collection映射到用户对象的订单列表属性中;订单明细:一个订单对应多个明细,使用collection映射到订单对象中的明细属性中;商品信息:一个订单明细对应一个商品,使用association映射到订单明细对象的商品属性中。
<!-- 一对多查询 查询用户信息、关联查询订单、订单明细信息、商品信息 --> <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>