用户与订单关联关系图
与一对一的关联关系相比,接触更多的关联关系是一对多(或多对一)。例如一个用户可以有多个订单,多个订单也可以归一个用户所有。用户和订单的关联关系如图。
一、<collection>元素
在MyBatis中,通过<collection>元素来处理一对多关联关系。<collection>元素的属性大部分与<association>元素相同,但其还包含一个特殊属性一ofType。ofType属性与javaType属性对应,它用于指定实体类对象中集合类属性所包含的元素的类型。
<collection>元素的配置方式
<collection>元素是<resultMap>元素的子元素,<collection >元素有嵌套查询和嵌套结果两种配置方式。
a.嵌套查询方式
<collection property="ordersList"
column="id"
ofType="com.mac.pojo.Orders"
select=" com.mac.mapper.OrdersMapper.selectOrders"/>
b.嵌套结果方式
<collection property="ordersList"ofType="com.mac.pojo.Orders">
<id property="id" column="orders_id" />
<result property="number" column="number" />
</collection>
二、接下来以用户和订单之间的一对多关联关系为例,详细讲解如何在MyBatis中处理一对多关联关系,具体步骤如下。
1、在名为mybatis的数据库中,创建两个数据表,分别为tb_user(用户数据表)和tb_orders(订单表),同时在表中预先插入几条测试数据。
USE mybatis;
# 创建一个名称为tb_user的表
CREATE TABLE tb_user (
id int(32) PRIMARY KEY AUTO_INCREMENT,
username varchar(32),
address varchar(256) );
# 插入3条数据
INSERT INTO tb_user VALUES ('1', '小明', '北京');
INSERT INTO tb_user VALUES ('2', '李华', '上海');
INSERT INTO tb_user VALUES ('3', '李刚', '上海');
# 创建一个名称为tb_orders的表
CREATE TABLE tb_orders (
id int(32) PRIMARY KEY AUTO_INCREMENT,
number varchar(32) NOT NULL,
user_id int(32) NOT NULL,
FOREIGN KEY(user_id) references tb_user(id));
#插入3条数据
INSERT INTO tb_orders VALUES ('1', '1000011', '1');
INSERT INTO tb_orders VALUES ('2', '1000012', '1');
INSERT INTO tb_orders VALUES ('3', '1000013', '2');
2、创建持久化类Orders,并在类中定义订单id和订单编号等属性。
public class Orders {
private Integer id; //订单id
private String number; //订单编号
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
return "Orders [id=" + id + ", number=" + number + "]";
}
}
3、创建持久化类Users,并在类中定义用户编号、用户姓名、 用户地址以及用户关联的订单等属性。
public class Users {
private Integer id; // 用户编号
private String username; // 用户姓名
private String address; // 用户地址
private List<Orders> ordersList; // 用户关联的订单
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username
+ ", address="+ address + ", ordersList=" + ordersList + "]"; }
}
4、创建用户实体映射文件UsersMapper.xml,并在文件中编写一对多关联映射查询的配置。
<mapper namespace="com.mac.mapper.UsersMapper">
<resultMap type="Users" id="UserWithOrdersResult">
<!-- 只展示了部分标签内容,一对多关联映射 -->
<collection property="ordersList" ofType="Orders">
<id property="id" column="orders_id"/>
<result property="number" column="number"/>
</collection>
</resultMap>
</mapper>
5、在核心配置文件mybatis-config.xml中,引入UsersMapper.xml,将UsersMapper.xml映射文件加载到程序中。
<mapper resource="com/mac/mapper/UsersMapper.xml”/>
6、在测试类MyBatisTest中,编写测试方法findUserTest()。
public void findUserTest() {
// 1.通过工具类生成SqlSession对象
SqlSession session = MyBatisUtils.getSession();
// 2.查询id为1的用户信息
Users users = session.selectOne("com.mac.mapper."
+ "UsersMapper.findUserWithOrders", 1);
// 3.输出查询结果信息
System.out.println(users);
// 4.关闭SqlSession
session.close();
}