一对一映射之resultType
需求:联合order表和user表,查询每个用户的订单信息和用户信息
步骤:
1 定义orders订单PO类 属性与表对应
2 由于要得到用户的订单列表,所以订单类中要有user属性
创建OrdersExt扩展类,并继承Orders类
3 在OrdersExt类中定义username属性和sex属性
4 在OrderMapp接口中
public List findOrdersAndUser();
5 OrderMapper映射文件中
一对一映射之resultType
< select id=“findOrdersAndUser” resultType=“com.itheima.mybatis.po.OrdersExt”>
SELECT
orders.id
,
orders.user_id
,
orders.number
,
user.username
,
user.sex
FROM
orders,
USER
WHERE orders.user_id
= user.id
< /select>
在OrdersMapper.xml中查询的user.'username’会自动映射到OrdersExt 中的username属性上
6 测试类
List list = mapper.findOrdersAndUser();
< resultMap id=“userAndOrders” type=“com.xlj.Po.OrdersPojo”>
< id column=“id” property=“id”>< /id>
< result column=“username” property=“username”>< /result>
< result column=“sex” property=“sex”>< /result>
< result column=“user_id” property=“userId”>< /result>
< result column=“number” property=“number”>< /result>
< /resultMap>
< select id=“findAllUsersAndOrders” resultMap=“userAndOrders”>
select orders.id,orders.createtime,user.username,user.sex,orders.user_id,orders.number from USER , orders WHERE user.id = orders.user_id;
< /select>
注意:
如果属性中userId名字与表中字段user_id不一样,也可以通过给查询出来的虚拟表中字段user_id起一个别名为userId,这样mybatis也会自动映射
< select id=“findAllUsersAndOrders” resultMap=“userAndOrders”>
select orders.id,user.username,user.sex,orders.user_id userId,orders.number from USER , orders WHERE user.id = orders.user_id;
< /select>
一对一映射之resultMap映射user对象
步骤:
1 在 OrdersExt类中private User user;
2 目的将订单中user信息映射到user属性上
3 OrderMapper中
//一对一之resultMap
public List findOrdersAndUserRstMap();
4 在OrderMapper.xml中
< resultMap type=“cn.lanou.mybaits.po.OrdersExt” id=“OrdersAndUserRstMap”>
< id column=“id” property=“id” />
< result column=“user_id” property=“userId” />
< result column=“number” property=“number” />
< result column=“createtime” property=“createtime” />
<!-- 用户信息(一对一) -->
<!-- association:一对一关联映射 -->
<!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
<!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
<association property="user" javaType="cn.lanou.mybaits.po.User">
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
</association>
< /resultMap>
< 一对一映射之resultMap >
< select id=“findOrdersAndUserRstMap” resultMap=“OrdersAndUserRstMap”>
SELECT
orders.id
,
orders.user_id
,
orders.number
,
orders.createtime
,
user.username
,
user.sex
FROM
orders,
USER
WHERE orders.user_id
= user.id
< /select>
一对多映射
三张表之间的一对多映射
orders,USER,orderdetail
需求:查询所有用户的订单及订单详情
步骤
1 创建Orderdetail的Po类
2 ordersExt类中定义
private List detailList;
注意返回值是Orderdetail对象的集合,得到Orderdetail对象就得到想要的信息
3 orderMapper接口文件中
public List findOrdersAndDetailRstMap();
4 orderMapper映射文件中
< select id=“findOrdersAndDetailRstMap” resultMap=“OrdersAndDetailRstMap”>
SELECT
orders.id
,
orders.user_id
,
orders.number
,
user.username
,
user.sex
,
orderdetail.id
detailId,
orderdetail.items_id
,
orderdetail.items_num
FROM
orders,
USER,
orderdetail
WHERE
orders.user_id
= user.id
AND orders.id
= orderdetail.orders_id
< /select>
其中resultMap=“OrdersAndDetailRstMap”
5 因为最终返回结果为OrdersExt对象
在OrdersExt对象中 user对象与order对象是一对一关系
而order与orderdetail是一对多关系
此处不能使用javaType 否则报错
且结果包含之前一对一的结果,所以可以直接使用继承来获得之前的结果关系
多对多映射
需求:查询该用户的订单详情,包括用户信息,订单信息,详情信息,商品信息
四张表的信息
返回值为OrdersPojo类型的情况
ordersDetail类与Items类是一对一关系
ordersDetail类中有一个Items属性
< resultMap id=“userOrdersItems” type=“com.xlj.Po.OrdersPojo” extends=“userOrdersMap”>
< collection property=“ordersDetailList” ofType=“com.xlj.Po.OrderDetail”>
< id column=“detailId” property=“id”>< /id>
< result column=“orders_id” property=“ordersId”>< /result>
< result column=“items_id” property=“itemsId”>< /result>
< result column=“items_num” property=“itemsNum”>< /result>
<association property="items" javaType="com.xlj.Po.Items">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="price" property="price"></result>
<result column="detail" property="detail"></result>
<result column="detail" property="detail"></result>
<result column="createTime" property="createTime"></result>
</association>
</collection>
</resultMap>
<select id="findUserOrdersdetailItems" resultMap="userOrdersItems">
SELECT
orders.id
,
orders.user_id
,
orders.number
,
user.username
,
user.sex
,
user.id
,
orderdetail.id
detailId,
orderdetail.items_id
,
orderdetail.items_num
,
items.id
,
items.name
,
items.price
FROM
orders,
USER,
orderdetail,
items
WHERE orders.user_id
= user.id
AND orders.id
=
orderdetail.orders_id
AND orderdetail.items_id
= items.id
继承自
< resultMap id=“userOrdersMap” type=“com.xlj.Po.OrdersPojo”>
< id column=“id” property=“id”>< /id>
< result column=“number” property=“number”>< /result>
< result column=“createtime” property=“createTime”>< /result>
< association property=“user” javaType=“com.xlj.Po.User”>
< id column=“user_id” property=“id”>< /id>
< result column=“username” property=“name”>< /result>
< result column=“sex” property=“gender”>< /result>
< /association>
< /resultMap>
包装类中:
多对多查询,返回值为User类型的情况
步骤:
1 在ordersMapper接口中
public List findUserAndItemsRstMap();
注意返回的是User对象的集合,说明返回结果是从User类开始包装的
也就是获取到user对象就得到一切信息
2 在User类中
3 在Orders类中有如下关系
private List detailList;
4 在Orderdetail类中有如下关系
一个订单明细对应一个商品
private Items items;
5 Items类中
6 在ordersMapper.xml中
=多对多=
<–UserAndItemRstMap-- >
<resultMap type="com.xlj.Po.User" id="UserAndItemsRstMap">
<!-- 用户信息: 用户和订单是一对多关系 -->
<id column="user_id" property="id" />
<result column="username" property="name" />
<result column="sex" property="gender" />
<!-- 订单信息(一对多)订单跟明细也是一对多 -->
<collection property="ordersList" ofType="com.xlj.Po.Orders">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<!-- 订单明细信息(一对多)根据订单明细id查询得到商品id只会有一个 -->
<collection property="orderDetailList" ofType="com.xlj.Po.OrderDetail">
<id column="detailId" property="id" />
<result column="items_id" property="itemsId" />
<result column="items_num" property="itemsNum" />
<!-- 商品信息(一对一) -->
<association property="items" javaType="com.xlj.Po.Items">
<id column="items_id" property="id" />
<result column="name" property="name" />
<result column="price" property="price" />
</association>
</collection>
</collection>
</resultMap>
<!-- 多对多 -->
<select id="findUserOrdersDetailItems" resultMap="UserAndItemsRstMap">
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
user.`id`,
OrderDetail.`id` detailId,
OrderDetail.`items_id`,
OrderDetail.`items_num`,
items.`id`,
items.`name`,
items.`price`
FROM
orders,
USER,
OrderDetail,
items
WHERE orders.`user_id` = user.`id`
AND orders.`id` =
OrderDetail.`orders_id`
AND OrderDetail.`items_id` = items.`id`
</select>
上面表中,各自的id必须要有,否则表之间无法关联映射
没有id认为你是一条
多对多查询优化
将多个sql操作通用的sql语句抽取出来放到sql片段中
定义查询订单表列名的SQL片段
< sql id=“select_orders”>
orders.id
,
orders.user_id
,
orders.number
,
< /sql>
定义查询用户表列名的SQl片段
< sql id=“select_user”>
user.username
,
user.sex
< /sql>
定义查询用户表列名的SQL片段
< sql id=“select_orderdetail”>
orderdetail.id
detailId,
orderdetail.items_id
,
orderdetail.items_num
< /sql>