承接上一篇:Mybatis 学习笔记(四)——关联(映射)关系(一对一,一对多)
三、多对多映射关系
1. 需求:查询用户及商品信息
2. POJO类
/mybatis01/src/com/po/User.java
package com.po;
import java.util.Date;
import java.util.List;
/**
* 用户类
* @author 欧阳
*
*/
public class User {
private int id; //id
private String username; //用户名
private String sex; //性别
private Date birthday; //生日
private String address; //地址
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Orders> getOrderslist() {
return orderslist;
}
public void setOrderslist(List<Orders> orderslist) {
this.orderslist = orderslist;
}
}
/mybatis01/src/com/po/Orders.java
package com.po;
import java.util.Date;
import java.util.List;
/**
* 订单类
* @author 欧阳
*
*/
public class Orders {
private Integer id; //id
private Integer userId; //用户id
private String number; //数量
private Date createtime; //创建时间
private String note; //备注
private User user; //用户信息
private List<Orderdetail> orderdetail; //订单明细
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Orderdetail> getOrderdetail() {
return orderdetail;
}
public void setOrderdetail(List<Orderdetail> orderdetail) {
this.orderdetail = orderdetail;
}
}
/mybatis01/src/com/po/Orderdetail.java
package com.po;
/**
* 订单详情类
* @author 欧阳
*
*/
public class Orderdetail {
private Integer id;
private Integer ordersId;
private Integer itemsId;
private Integer itemsNum;
private Items items;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOrdersId() {
return ordersId;
}
public void setOrdersId(Integer ordersId) {
this.ordersId = ordersId;
}
public Integer getItemsId() {
return itemsId;
}
public void setItemsId(Integer itemsId) {
this.itemsId = itemsId;
}
public Integer getItemsNum() {
return itemsNum;
}
public void setItemsNum(Integer itemsNum) {
this.itemsNum = itemsNum;
}
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
}
/mybatis01/src/com/po/Items.java
package com.po;
import java.util.Date;
/**
* 商品类
* @author 欧阳
*
*/
public class Items {
private Integer id;
private String name;
private Float price;
private String pic;
private Date createtime;
private String detail;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic == null ? null : pic.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail == null ? null : detail.trim();
}
@Override
public String toString() {
return "Items [id=" + id + ", name=" + name + ", price=" + price
+ ", pic=" + pic + ", createtime=" + createtime + ", detail="
+ detail + "]";
}
}
3. 编写Mapper.xml
将下面的代码加入 OrdersCustomMapper.xml 中
<!--
查询用户及用户购买商品信息(多对多)
-->
<resultMap type="com.po.User" id="UserAndItemsResultMap">
<!-- 用户信息 -->
<id column="u_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<!-- 配置映射的订单信息 -->
<collection property="orderslist" ofType="com.po.Orders">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 配置映射的订单明细信息 -->
<collection property="orderdetail" ofType="com.po.Orderdetail">
<id column="od_id" property="id"/>
<result column="orders_id" property="ordersId"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<!-- 配置映射的商品信息 -->
<association property="items" javaType="com.po.Items">
<id column="i_id" property="id"/>
<result column="name" property="name"/>
<result column="detail" property="detail"/>
<result column="price" property="price"/>
</association>
</collection>
</collection>
</resultMap>
<select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
SELECT
o.*,
u.id u_id,
u.username,
u.sex,
u.address,
od.id od_id,
od.items_id,
od.items_num,
od.orders_id,
i.id i_id,
i.name,
i.detail,
i.price
FROM
orders o,
USER u,
orderdetail od,
items i
WHERE
o.user_id = u.id
AND od.orders_id = o.id
AND od.items_id = i.id
</select>
4. 编写Mapper接口
将下面代码添加到 OrdersCustomMapper.java 中
/*
* 查询用户及商品信息
*/
public List<User> findUserAndItemsResultMap() throws Exception;
5. Mapper接口测试
将下面代码加入 OrdersCustomMapperTest.java 中
@Test
public void testFindUserAndItemsResultMap() {
SqlSession sqlsession = sqlSessionFactory.openSession();
OrdersCustomMapper mapper = sqlsession
.getMapper(OrdersCustomMapper.class);
try {
List<User> users = mapper.findUserAndItemsResultMap();
System.out.println(users.size());
} catch (Exception e) {
e.printStackTrace();
}
}
四、总结
个人觉得这个映射关系配置非常简单,只要掌握了规律就可以编写出。在POJO编写、Mapper.xml编写、Mapper接口编写这三步中,最难的就是POJO编写。
在知道需求之后,首先第一步要确定查询的哪张表是主表,哪些是从表,在分析出这个之后,在主表对应的POJO的基础之上增加从表对应的POJO为属性(一对一则为属性,一对多为集合属性),然后再分析该POJO(属性)相应的表下是否有从表,接着在该POJO的基础上再增加从表对应的POJO为属性(一对一则为属性,一对多为集合属性),以此类推直到没有从表了。
在编写Mapper.xml文件时,一般属性用 result ;一对一用 association ;一对多用 collection;而多对多是用 result 、association 、collection三个之间相互嵌套表示,按照我编写POJO的思路根据POJO的属性和主从的先后关系一步一步的编写 Mapper.xml 文件就不会出错。
而在编写Mapper接口时只需要安装开发规范编写即可。