Mybatis负责的是Dao层之间的交互,我们都知道表与表之间具有三种关系,一对一,一对多,多对多。我们要想让结果封装到bean中,就要通过resultMap关键字进行映射。
type="" id="">
type表示bean的类型。
id表示该resultMap的名称。
在resultMap子标签中,有许多有用的子标签
<id column="" property=""/>
<result column="" property=""/>
<association property="" javaType="">
<collection property="" ofType="">
id:表示数据表中的主键字段,必须要有。
column:表示表中的字段
property:表示bean中的属性名称
result:表示普通字段
association :通常被用于一对一的关系,通常是外键字段
javaType:被涉及表的bean
collection :通常被用于表示一对多,多对多关系,通常是外键字段
ofType:被涉及表的bean
生活中,我们也经常会遇到一对一事件的关系,像一个一张车票对应一个顾客等等事件。在Mybatis中,我们该如何配置这种映射文件呢?
【1】建表语句
create table people (id int primary key auto_increment, name varchar(20));
create table ticket(id int primary key auto_increment, price int, pid int);
【2】创建实体类
车票类:
public class Ticket {
private int id;
private int price;
private People pl;
setter与getter方法....
}
用户类:
public class People {
private int id;
private String name;
setter与getter.....
}
【3】ticketMapper映射文件(以查询语句为例)
在这个案例中,大家应该注意<association property="people" javaType="domain.People">,property对应的是该bean类中涉及外表的属性值,javaType则对应该属性对应的实体类。
此外,inner join是内连接查询,用于查询在on的条件下,两张表都有涉及的数据
生活中,有许多一对多关系的事件,就像一个班级对应多个学生,一个部门对应多个员工等等。
接下来,我们以班级与学生的关系为例,介绍Mybatis如何实现一对多。
【1】建表语句
create table class (id int primary key auto_increment, name varchar(20));
create table student (id int primary key auto_increment, name varchar(20),cid int);
insert into class values(null,'数媒1班');
insert into class values(null,'数媒2班');
insert into student values(null,'张三',1);
insert into student values(null,'李四',2);
insert into student values(null,'王五',2);
insert into student values(null,'赵六',1);
【2】实体类创建
学生类创建
public class Student {
private int id;
private String name;
private ClassStu cls;
setter与getter方法
toString方法
}
教室类创建
public class ClassStu {
private int id;
private String name;
private List list;
setter与getter方法
toString方法
}
【3】映射文件配置
(1)以学生为主体
因为,一位学生就对应一个班级,所以说,采用association 标签,用来进行关系映射。
(2)以班级为主体
因为,一个班级对应多个学生,所以说采用collection标签,进行关系映射。注意collection与assocation标签中的字段数据类型,一个是ofType,一个·是javaType。
我们生活中也有许多,多对多关系的情况,像老师与学生的关系。医生与病人的关系等等。接下来,我就以医生与病人的关系进行阐述。
【1】建表语句
多对多的关系需要三张表进行操作。其中,有一张表,表示其他两张表的对应关系。
insert into docter values(null, '王医生');
insert into docter values(null, '李护士');
insert into docter values(null, '张医生');insert into patient values(null, '张三');
insert into patient values(null, '李四');insert into relation values(null, 1,1);
insert into relation values(null, 2,1);
insert into relation values(null, 2,2);
insert into relation values(null, 3,2);
【2】实体类
医生类
public class Docter {
private int id;
private String name;
private List patient;
setter与getter方法
toString方法
.....
}
病人类
public class Patient {
private int id;
private String name;
private List docter;
.....
setter与getter方法
toString方法
.....
}
【3】映射文件配置
因为每个对象都有多个对应的对象,所以采用collection标签。
其次,因为涉及三表查询,所以使用两次内连接查询,用以过滤掉不符合条件的信息字段。
同理,如果以病人为主体,只需要修改resultMap中的少许信息即可。
当表中的字段与实体类名称不一致的时候,可以使用resultMap标签,进行对应。
其中,people表的字段,与实体类的属性名称不能一一对应,所以就不能自动封装数据。故可以使用resultMap标签进行关系映射。
id -> pid
name -> pname
大家要注意,此时返回值的标签不在是resultType,而是resultMap。