MyBatis中的级联分为3种:association,collection和discriminator:
1.association
:代表一对一关系,比如学生和学生证是一对一关系。
2.collection
:代表一对多关系,比如学生和课程是一对多关系,一个学生可以有多个课程。
3.discriminator
:鉴别器,它可以根据实际选择采用哪个类作为实例,允许你根据特定的条件去关联不同的结果集。
根据模型新建库表:
1 | CREATE TABLE t_lecture( |
association
用t_student和t_student_selfcard演示一对一级联。
新增Student POJO:
1 | public class Student { |
StudentSelfcard POJO:
1 | public class StudentSelfcard { |
定义接口StudentSelfcardMapper:
1 | public interface StudentSelfcardMapper { |
创建对应的映射文件StudentSelfcardMapper.xml:
1 |
|
接着定义接口StudentMapper:
1 | public interface StudentMapper { |
其相对于的映射文件StudentMapper.xml:
1 |
|
设置别名,指定mapper略。
先往库表插入值:
1 | ... |
查询库表:
1 | mysql> select * from t_student; |
插入成功,现测试级联获取:
1 | ... |
控制台输出:
1 | 旋涡辛久奈的学生证 |
success.
collection
学生和学生成绩是一对多的关系,所以用t_student和t_student_lecture表练习一对多级联。
修改Student POJO:
1 | public class Student { |
新增StudentLecture POJO:
1 | public class StudentLecture { |
新建StudentLectureMapper接口:
1 | public interface StudentLectureMapper { |
其对应的映射文件StudentLectureMapper.xml:
1 |
|
修改StudentMapper.xml:
1 |
|
先插入一些测试数据:
1 | ... |
查询数据库:
1 | mysql> select * from t_student; |
插入成功,现测试级联获取lectures:
1 | ... |
控制台输出:
1 | 语文成绩:99.0 |
success.
discriminator
鉴别器其实同其他级联一样,只不过是多了个鉴别的过程罢了。
为了学习鉴别器,我们向t_student_health_female和t_student_health_male中插入一组数据:
1 | INSERT INTO `t_student_health_female` |
其对应的实体类StudentHealthFemale和StudentHealthMale略。
新增两个POJO:MaleStudent和FemaleStudent均继承自Student:
1 | public class MaleStudent extends Student{ |
1 | public class FemaleStudent extends Student{ |
接着编写两个接口StudentHealthMaleMapper和StudentHealthFemaleMapper,包含一个根据studentId获取health的抽象方法:
1 | import mrbird.leanote.pojo.StudentHealthMale; |
1 | import mrbird.leanote.pojo.StudentHealthFemale; |
各自对应的映射器:
StudentHealthMaleMapper.xml:
1 |
|
因为在MyBatis配置文件中配置了<setting name="mapUnderscoreToCamelCase" value="true"/>
,并且数据库命名规范,所以这里可以用select * from…
studentHealthFemaleMapper.xml:
1 |
|
接下来就是重点了,我们修改StudentMapper.xml:
1 |
|
测试一下:
1 | ... |
页面输出:
1 | 水门的前例腺良好 |
(≖ ‿ ≖)✧
延迟加载
假如一次性将所有与Student有关的信息都加载出来,这必定会造成性能的问题,如:
1 |
|
MyBatis的延迟加载策略可以很好的应对这种情况。只需在mybatis-config.xml中配置:
1 | <settings> |
然后我们在级联标签上可以自由的配置fetchType=”lazy”或者fetchType=”eager”来改变加载策略。
eager 英[ˈi:gə(r)] 美[ˈiɡɚ] adj. 急切; 渴望的; 热心的; 热切的,热情洋溢的;
另外一种级联
所谓的另外一种级联就是用一条sql查出所有学生的信息,没有性能问题。
在StudentMapper中定义一个查找所有学生信息的抽象方法:
1 | public List<Student> finAllStudentMsg(); |
其映射文件如下:
1 |
|
测试finAllStudentMsg方法:
1 | ... |
控制台输出:
1 | 辛久奈的卡号:10000 |
这种方式比较直观明了,但是SQL编写起来较为繁琐。