多对多映射
四张表关联查询。
业务需求:查询用户的信息,以及它所购买商品的订单信息、商品信息
业务分析:通过查询user表,查找到orders,通过orders表查找到对应的orderdetail,通过orderdetail表查到对应items。
user-用户表 、orders-订单表 、orderdetail-订单明细表 、items-商品表
1.创建实体类pojo
a.建立用户表的pojo:一个用户有多个订单,需要在用户表中加入订单列表
package com.example.data;
import java.util.List;
public class User {
private int id;
private String username;
private String sex;
//一个用户有多个订单,用户需要创建订单列表
private List<Orders> ordersList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public List<Orders> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
}
b.建立订单表的pojo:一个订单有多个订单明细,订单中需要创建订单的详细信息列表
package com.example.data;
import java.util.List;
public class Orders {
private int id;
private int userId;
private String no;
private String remark;
//一个订单有多个订单明细,订单需要创建订单明细列表
private List<Orderdetail> orderdetails;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public List<Orderdetail> getOrderdetails() {
return orderdetails;
}
public void setOrderdetails(List<Orderdetail> orderdetails) {
this.orderdetails = orderdetails;
}
}
c.建立订单明细表的pojo:一个订单明细对应一个商品信息,需要创建商品信息属性
package com.example.data;
public class Orderdetail {
private int id;
private int ordersId;
private int itemsId;
private int itemsNo;
//订单明细对应商品信息
private Items items;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getOrdersId() {
return ordersId;
}
public void setOrdersId(int ordersId) {
this.ordersId = ordersId;
}
public int getItemsId() {
return itemsId;
}
public void setItemsId(int itemsId) {
this.itemsId = itemsId;
}
public int getItemsNo() {
return itemsNo;
}
public void setItemsNo(int itemsNo) {
this.itemsNo = itemsNo;
}
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
}
d.建立商品表的pojo:
package com.example.data;
public class Items {
private int id;
private String name;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
2.编写Mapper.xml:
<!--多对多查询:查询用户购买的商品的所有信息-->
<resultMap id="UserAndItemsResultMap" type="com.example.data.User">
<!--User表是主表,添加用户信息
column:取得是数据库的列名,如果给数据库列名定义了别名,就取别名-->
<id column="user_id" property="id"></id>
<result column="username" property="username"></result>
<result column="sex" property="sex"></result>
<!--订单信息-->
<!--一个用户可以对应多个订单,使用collection一对多映射-->
<collection property="ordersList" ofType="com.example.data.Orders">
<id column="id" property="id"></id>
<result column="user_id" property="userId"></result>
<result column="no" property="no"></result>
<result column="remark" property="remark"></result>
<!--订单明细-->
<!--一个订单包括多个明细,使用collection一对多映射
column:取得是数据库的列名,如果给数据库列名定义了别名,就取别名-->
<collection property="orderdetails" ofType="com.example.data.Orderdetail">
<id column="orderdetail_id" property="id"></id>
<result column="items_id" property="itemsId"></result>
<result column="items_no" property="itemsNo"></result>
<result column="orders_id" property="ordersId"></result>
<!--商品信息-->
<!--一个订单明细对应一个商品信息,,使用association 一对一映射
column:取得是数据库的列名,如果给数据库列名定义了别名,就取别名-->
<association property="items" javaType="com.example.data.Items">
<id column="items_id" property="id"></id>
<result column="items_name" property="name"></result>
<result column="items_price" property="price"></result>
</association>
</collection>
</collection>
</resultMap>
<select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
SELECT
orders.*,
user.username,
user.sex,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_no,
orderdetail.orders_id,
items.name items_name,
items.price 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>
3.编写Mapper.java:
//多对多查询:查询用户购买的商品的所有信息
public List<User> findUserAndItemsResultMap()throws Exception;
输出结果日志:
总结:
根据上面业务分析,分析表跟表之间的对应关系。一对多关系,就使用collection,一对一关系,就使用association。一层层嵌套,association放在最底层。
实际上多对多的查询是把所有关联的表的信息都查询出来,放到pojo中的对应的List或者某个类中。所以只查询用户信息表User,就会得到要查询的信息,因为这个用户里包含了那些信息。