商品订单关系图
(1)一对一映射
1、需求:查询订单信息,关联查询用户信息
2、sql实现:主信息:orders,从信息:user
那么sql语句为:
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`
FROM
orders,
USER
WHERE orders.`user_id` = user.`id`
3、具体实现
resultType方式
首先创建扩展类:
public class OrdersExt extends Orders {
// user.`username`,user.`sex`
private String username;
private String sex;
//get set
}
然后在OrdersMapper.xml中:
<!-- 一对一映射之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>
在接口中:
//一对一之resultType
public List<OrdersExt> findOrdersAndUser();
小结:
使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。
resultMap方式
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。首先修改扩展类:
public class OrdersExt extends Orders {
private User user;//用户信息
//get set
}
然后在映射文件中:
<!-- OrdersAndUserRstMap -->
<resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndUserRstMap">
<!-- 订单信息 -->
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<!-- 用户信息(一对一) -->
<!-- association:一对一关联映射 -->
<!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
<!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
<association property="user" javaType="com.itheima.mybatis.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`,
user.`username`,
user.`sex`
FROM
orders,
USER
WHERE orders.`user_id` = user.`id`
</select>
小结:
在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,比如:查询订单列表,然后在点击列表中的查看订单明细按钮,这个时候就需要使用resultMap进行结果映射。而resultType更适应于查询明细信息,比如,查询订单明细列表。
(2)多对多映射
多对多映射是一对多映射的特例
1、需求:查询用户信息,关联查询该用户购买的商品信息
2、Sql实现:主信息:user,从信息:items、orders、orderdetail(一个用户对应多个商品,一个商品对应多个用户;)那么sql语句:
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
orderdetail.`id` detailId,
orderdetail.`items_id`,
orderdetail.`items_num`,
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`
3、具体实现
首先修改User类(这里没有新加扩展类),在User类中添加List orders
public class User{
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//订单信息
private List<Orders> orders;
}
然后在Orders类中也添加List detailList
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//订单明细集合
private List<Orderdetail> detailList;
}
然后在Orderdetail中添加Items items
public class Orderdetail {
private Integer id;
private Integer ordersId;
private Integer itemsId;
private Integer itemsNum;
//商品信息
private Items items;
}
然后在映射文件中:
<!-- UserAndItemsRstMap -->
<resultMap type="com.itheima.mybatis.po.User" id="UserAndItemsRstMap">
<!-- 用户信息 -->
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
<!-- 订单信息(一(用户)对多(订单)) -->
<collection property="orders" ofType="com.itheima.mybatis.po.Orders">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<!-- 订单明细信息(一对多) -->
<collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail">
<id column="detailId" property="id" />
<result column="items_id" property="itemsId" />
<result column="items_num" property="itemsNum" />
<!-- 商品信息(一对一) -->
<association property="items" javaType="items">
<id column="items_id" property="id" />
<result column="name" property="name" />
<result column="price" property="price" />
</association>
</collection>
</collection>
</resultMap>
<!-- 多对多 -->
<select id="findUserAndItemsRstMap" resultMap="UserAndItemsRstMap">
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
orderdetail.`id` detailId,
orderdetail.`items_id`,
orderdetail.`items_num`,
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>
在Mapper接口中:
public List<User> findUserAndItemsRstMap();//多对多