MyBatis在映射文件中加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。
嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型;
嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集;
该元素中包含以下属性:
property:指定映射到的实体类对象属性,与表字段一一对应。
column:指定表中对应的字段。
javaType:指定映射到实体对象属性的类型。
select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询。
fetchType:指定在关联查询时是否启用延迟加载。fetchType属性有lazy和eager两个属性值,默认值为lazy(延迟加载)。
案例:
1、目前有两张表:tb_idcard表和tb_person表
CREATE TABLE tb_idcard(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAR(18)
);
CREATE TABLE tb_person(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32),
age INT,
sex VARCHAR(8),
card_id INT UNIQUE,
FOREIGN KEY(card_id) REFERENCES tb_idcard(id)
);
2、定义实体类(使用Lombok简化getters and setters)
@Data
public class IdCard{
private Integer id;
private String code;
}
@Data
public class Person {
private Integer id;
private String name;
private Integer age;
private String sex;
private IdCard card; //一对一,关联的身份证
}
3、映射文件 IdCardMapper.xml
4、映射文件PersonMapper.xml
上面这种方式是嵌套查询,先执行一个简单的SQL语句,然后再进行结果映射时,将关联对象再
案例:以用户和订单为案例,一个用户可以拥有多个订单(一对多),同样多个订单也可以同属于一个用户(多对一)。
1、创建用户表和订单表
CREATE TABLE tb_user(
id INT(32) PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
address VARCHAR(256)
);
CREATE TABLE tb_order(
id INT(32) PRIMARY KEY AUTO_INCREMENT,
number VARCHAR(32) NOT NULL,
user_id INT(32),
FOREIGN KEY(user_id) REFERENCES tb_user(id)
);
2、实体类
@Data
public class Orders{
private Integer id; //订单id
private String number; //订单编号
}
@Data
public class User{
private Integer id; //用户编号
pirvate String username; //用户姓名
private String address; //用户地址
private List ordersList; //用户关联订单
}
3、映射文件
案例:以订单和商品为例,一个订单可以包含多个商品,而一种商品又可以属于多个订单,因此订单和商品就是多对多的关系。
在数据库中多对多的关系通过一个中间表进行维护。
1、创建商品表,订单表,中间表
CREATE TABLE tb_product(
id INT(32) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32),
price DOUBLE
);
CREATE TABLE tb_order(
id INT(32) PRIMARY KEY AUTO_INCREMENT,
number VARCHAR(32) NOT NULL,
user_id INT(32),
FOREIGN KEY(user_id) REFERENCES tb_user(id)
);
CREATE TABLE tb_ordersitem(
id INT(32) PRIMARY KEY AUTO_INCREMENT,
orders_id INT(32),
product_id INT(32),
FOREIGN KEY(orders_id) REFERENCES tb_order(id),
FOREIGN KEY(product_id) REFERENCES tb_product(id)
);
2、实体类
@Data
public class Product{
private Integer id; //商品编号
private String name; //商品名称
private Integer price; //商品价格
private List ordersList; //与订单的关联属性
}
@Data
public class Orders{
private Integer id; //订单id
private String number; //订单编号
private List productList; //与商品的关联属性
}
3、映射文件
文章参考《Java EE企业级应用开发教程》