MyBatis学习之一----多表查询
1、mybatis实际上并不是pojo和数据库的字段的对应,而是pojo和sql语句的对应。
两个表通过相同的主键来查询
(1)内连接查询
select * from tb_order o,tb_user u where o.user_id = u.id;
查询tb_order和tb_user两个表中id相等的信息。
(2)外链接查询
select * from tb_order o LEFT JOIN tb_user u ON o.user_id = u.id //on后面是关联条件
与(1)结果相同。以外链接为主,以订单为主不管是否对应客户,都要把订单查询出来。
那么如何将两个表中查询的结果封装到一个对象中呢?既包含订单信息也包含用户信息。
第一种解决方案:新建一个类,包含订单和用户信息。将查询结果集和对象对应上。
扩展Order对象,来映射结果集。
面向对象的思想解决方式:
在Order对象中添加User对象
在Order类中,添加private User user;并添加getter和setter方法。
但是mapper用原来的sql并不能封装进来,无法完成自动映射。那么如何解决呢?
使用resultMap
association完成对象中 的某个对象的映射
<resultMap id="OrderUserDetailsResultMap" type="Order"> <!--order_id是sql中起的别名,property是数据库里面的实际名称--> <id column="order_id" property="id" /> <!--association是在一个对象中加入其它的单个对象。不能是集合对象。--> <association property="user" javaType="User" autoMapping="true"> <!--association子标签的内容参考resultMap--> <id column="user_id" property="id"/> </association> </resultMap>
<resultMap id="OrderUserDetailsResultMap" type="Order"> <!--order_id是sql中起的别名,property是数据库里面的实际名称--> <id column="order_id" property="id" /> <!--association是在一个对象中加入其它的单个对象。不能是集合对象。--> <association property="user" javaType="User" autoMapping="true"> <!--association子标签的内容参考resultMap--> <id column="user_id" property="id"/> </association> <!--完成集合映射 property:集合的属性的名字 javaType:集合的类型 ofType:集合中保存对象的数据类型 在这里details是List类型的List<Orderdetail> --> <collection property="details" javaType="List" ofType="Orderdetail" autoMapping="true"> <!--collection子标签,参考resultMap的书写--> <id column="detail_id" property="id"/> </collection> </resultMap>
<select id="queryOrderAndUserAndOrderDetailByOrderNumber" resultMap="OrderUserDetailsResultMap"> SELECT *,o.id as order_id, u.id as user_id, d.id as detail_id FROM tb_order o LEFT JOIN tb_user u ON o.user_id = u.id LEFT JOIN tb_orderdetail d ON d.order_id = o.id WHERE o.order_number = #{orderNumber} </select>
2、多对多查询
需求:查询订单,查询出下单人信息并且查询出订单详情中的商品数据。
3、resultMap的继承
resultMap标签内增加extends标签,继承其他resultMap,那么该resultMap内就不用再写重复的字段了。
4、延迟加载
需要的时候查,不需要的时候不查。
关联查询的时候才会有延迟加载
怎么实现分布查询,
坚持就是胜利