mybatis高级查询
- 问题1: 表和表之间有关系(1对多、1对多、多对多), pojo类和pojo类之间怎么建立和表一样的关系
- 1对1表关系
- 由任意一张表来维护外键
- 1对多表关系
- 由属于多的一方,来维护外键
- 多对多表关系
- 创建中间表,由中间表来维护外键
- 1对1表关系
- 想要掌握mybatis中多表查询的开发技巧:
-
先根据需求书写SQL语句
select tb_order.id, #as order_id, tb_order.order_number, tb_user.id, tb_user.user_name, tb_user.password, tb_user.name, tb_user.age, tb_user.sex from tb_order, tb_user where tb_user.id=tb_order.user_id and tb_order.order_number='20140921003';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ul4bwnaB-1649149495803)(imgs/image-20210901164337199.png)]
-
分析sql语句的查询结果,根据查询结果,来建立类和类之间的关系
public class Order{ private Integer id; private String orderNumber; //在表中是由Order表来维护外键 //private Integer userId;//不能这样使用 //在类中,使用对象来表示外键 private User orderUser; } public class User{ private Integer id; private String userName; password; name; age; sex; }
-
在映射文件中,配置多表查询的关系
- 使用resultMap
<resultMap id="orderMap" type="com.itheima.pojo.Order"> <id column="order_id" property="id"/> <result column="order_number" property="orderNumber"/> <!-- 配置:orderUser 表示User对象 配置1对1映射关系 --> <association property="orderUser" javaType="com.itheima.pojo.User" autoMapping="true"> <!-- 配置User的映射 --> <id column="id" property="id"/> <result column="user_name" property="userName"/> </association> </resultMap> <select id="xxxx" resultMap="orderMap"> ...... </select>
一对多查询:
-
select tb_user.id, tb_user.user_name, tb_user.password, tb_user.name, tb_user.age, tb_user.sex , tb_order.id as order_id, tb_order.order_number from tb_user , tb_order where tb_user.id = tb_order.user_id and tb_user.id = 1;
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qu5EU3gF-1649149495805)(imgs/image-20210901172730141.png)]
类之间关系
-
public class User{ //.... //类之间的关系 : 1 对 多 List<Order> orders; //一个用户下有多个订单 多的一方体现的方式:集合 } public class Order{ }
映射文件: 配置查询结果和Pojo类的映射关系
- 1对多关系:collection标签
association标签:
- property : 类中的属性名
- javaType: 属性的所属类型
collection标签:
- property : 类中属性名
- javaType : java.util.List 简写:list
- ofType : 集合中所存储元素的类型
多表查询:
- 根据查询结果,建立类和类之间的关系
- 根据查询的结果,配置结果集和Pojo类的映射关系
- 1对1映射: association
- property
- javaType
- 1对多映射:collection
- property
- javaType: list
- ofType : 集合中存储元素的类型
- 1对1映射: association
mybatis多表查询:
-
书写多表查询的sql语句
select tor.id as order_id, tor.order_number, tord.id as detail_id, tord.status, tord.total_price, ti.id as item_id, ti.item_detail, ti.item_name, ti.item_price from tb_order as tor, tb_orderdetail as tord, tb_item ti where tor.id = tord.order_id and ti.id = tord.item_id and tor.order_number = '20140921001';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RufWMlYa-1649149559498)(imgs/image-20210903095342474.png)]
-
基于sql语句的结果分析,建立类和类之间的关系
- 订单类 <==> 订单详情类
- 关系:1对多
- 订单详情类 <==> 商品类
- 关系:1对1
- 订单类 <==> 订单详情类
-
在映射文件中使用resultMap配置结果集和pojo类的映射关系
- 多对多映射本质,拆分为:1对多、1对1
- 1对多:collection
- 1对1 : association
- 多对多映射本质,拆分为:1对多、1对1
OrderMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.OrderMapper">
<resultMap id="orderMap2" type="Order" autoMapping="true">
<!-- 配置结果集和Order类的映射关系 -->
<id column="order_id" property="id"/>
<result column="order_number" property="orderNumber"/>
<!-- 配置订单详情
一个订单下有多个订单详情
-->
<collection property="orderdetails" javaType="list" ofType="Orderdetail" autoMapping="true">
<!-- 配置结果集和Orderdetail类的映射关系-->
<id column="tbrt_id" property="id"/>
<result column="total_price" property="totalPrice"/>
<!-- 配置商品信息
一个订单详情对应一个商品信息
-->
<association property="item" javaType="Item" autoMapping="true">
<!-- 配置结果集和Item的映射关系-->
<id column="item_id" property="id"/>
<result column="item_detail" property="itemDetail"/>
<result column="item_name" property="itemName"/>
<result column="item_price" property="itemPrice"/>
</association>
</collection>
</resultMap>
<select id="findOrderByNum" resultMap="orderMap2">
select
tb_order.id as order_id,
tb_order.order_number,
tbrt.id as tbrt_id,
tbrt.status,
tbrt.total_price,
tb_item.id as item_id,
tb_item.item_detail,
tb_item.item_name,
tb_item.item_price
from tb_order, tb_orderdetail as tbrt, tb_item
where
tb_order.id = tbrt.order_id
and tbrt.item_id = tb_item.id
and tb_order.order_number = #{orderNumber};
</select>
<resultMap id="orderMap" type="Order">
<!-- column属性值对应数据表中的属性名
property属性值对应类中的属性名
-->
<id column="id" property="id"/>
<result column="order_number" property="orderNumber"/>
<!-- 配置orderUser 表示User对象
配置一对一映射关系
-->
<!--
property属性值: 主表实体中对应从表的属性名称
javaType属性值: 从表实体类型
autoMapping属性值: 开启自动映射
-->
<association property="orderUser" javaType="User" autoMapping="true">
<!-- 配置User映射-->
<id column="user_id" property="id"/>
<result column="user_name" property="userName"/>
</association>
</resultMap>
<select id="findOrderByOrderNumber" resultMap="orderMap">
select tb_user.id as user_id,
tb_user.user_name,
tb_user.age,
tb_user.password,
tb_user.name,
tb_user.sex,
tb_order.id,
tb_order.order_number,
tb_order.user_id
from
tb_user, tb_order
where tb_user.id = tb_order.user_id
and tb_order.order_number = #{orderNumber}
</select>
</mapper>
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper">
<resultMap id="orderMap" type="User" autoMapping="true">
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<!--
property: 类中属性名
javaType: list
ofType: 集合中所存储元素的类型
-->
<collection property="orders"
javaType="list"
ofType="Order">
<!-- 配置Order类的映射关系 -->
<id column="order_id" property="id"/>
<result column="order_number" property="orderNumber"/>
</collection>
</resultMap>
<select id="findUserById" resultMap="orderMap">
select tb_user.id,
tb_user.user_name,
tb_user.password,
tb_user.name,
tb_user.age,
tb_user.sex,
tb_order.id as order_id,
tb_order.order_number
from tb_user, tb_order
where tb_user.id = tb_order.user_id
and tb_user.id = #{id};
</select>
</mapper>