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、延迟加载
需要的时候查,不需要的时候不查。
关联查询的时候才会有延迟加载
怎么实现分布查询,
坚持就是胜利