Mybatis中的3种级联方式
Mybatis中的级联
Mybatis的3种级联
- 鉴别器(discriminator): 他是一个根据某些条件决定采用具体实现类的级联的方案,比如体检要根据性别区分。
- 一对一(association): 比如你的省份证和你就是一种一对一的级联。
- 一对多(collection): 比如班主任和学生就是一种一对多的级联。
值得注意的是,Mybatis中没有多对多的级联,因为多对多级联比较复杂。使用困难,而且可以通过两个一对多级联进行替换,所以Mybatis不支持多对多级联。
示例
- 确定一个雇员级联模型
分析雇员级联模型
1. 该模型是以雇员表为中心的。
2. 雇员表和工牌表示 “一对一” 的级联关系。
3. 雇员表和员工任务表示 “ 一对多” 的级联关系。
4. 员工任务表和任务表是 “一对一” 的级联关系。
5. 每个员工都会有一个体检表,它是根据性别的不同,得到不同的关联表,所以是 “鉴别器” 的级联关系。
表的设计
SQL语句
DROP TABLE IF EXISTS t_female_health_form;
DROP TABLE IF EXISTS t_male_health_form;
DROP TABLE IF EXISTS t_task;
DROP TABLE IF EXISTS t_work_card;
DROP TABLE IF EXISTS t_employee_task;
DROP TABLE IF EXISTS t_employee;
/*==============================================================*/
/* Table: t_employee 雇员表 */
/*==============================================================*/
CREATE TABLE t_employee
(
id INT(12) NOT NULL AUTO_INCREMENT,
real_name VARCHAR(60) NOT NULL,
sex INT(2) NOT NULL COMMENT '1 - 男 0 -女',
birthday DATE NOT NULL,
mobile VARCHAR(20) NOT NULL,
email VARCHAR(60) NOT NULL,
POSITION VARCHAR(20) NOT NULL,
note VARCHAR(256),
PRIMARY KEY (id)
);
/*==============================================================*/
/* Table: t_employee_task 员工任务表 */
/*==============================================================*/
CREATE TABLE t_employee_task
(
id INT(12) NOT NULL auto_increment,
emp_id INT(12) NOT NULL,
task_id INT(12) NOT NULL,
task_name VARCHAR(60) NOT NULL,
note VARCHAR(256),
PRIMARY KEY (id)
);
/*==============================================================*/
/* Table: t_female_health_form 女性体检表 */
/*==============================================================*/
CREATE TABLE t_female_health_form
(
id INT(12) NOT NULL AUTO_INCREMENT,
emp_id INT(12) NOT NULL,
heart VARCHAR(64) NOT NULL,
liver VARCHAR(64) NOT NULL,
spleen VARCHAR(64) NOT NULL,
lung VARCHAR(64) NOT NULL,
kidney VARCHAR(64) NOT NULL,
uterus VARCHAR(64) NOT NULL,
note VARCHAR(256),
PRIMARY KEY (id)
);
/*==============================================================*/
/* Table: t_male_health_form 男性体检表 */
/*==============================================================*/
CREATE TABLE t_male_health_form
(
id INT(12) NOT NULL AUTO_INCREMENT,
emp_id INT(12) NOT NULL,
heart VARCHAR(64) NOT NULL,
liver VARCHAR(64) NOT NULL,
spleen VARCHAR(64) NOT NULL,
lung VARCHAR(64) NOT NULL,
kidney VARCHAR(64) NOT NULL,
prostate VARCHAR(64) NOT NULL,
note VARCHAR(256),
PRIMARY KEY (id)
);
/*==============================================================*/
/* Table: t_task 任务表 */
/*==============================================================*/
CREATE TABLE t_task
(
id INT(12) NOT NULL auto_increment,
title VARCHAR(60) NOT NULL,
context VARCHAR(256) NOT NULL,
note VARCHAR(256),
PRIMARY KEY (id)
);
/*==============================================================*/
/* Table: t_work_card 工牌表 */
/*==============================================================*/
CREATE TABLE t_work_card
(
id INT(12) NOT NULL AUTO_INCREMENT,
emp_id INT(12) NOT NULL,
real_name VARCHAR(60) NOT NULL,
department VARCHAR(20) NOT NULL,
mobile VARCHAR(20) NOT NULL,
POSITION VARCHAR(30) NOT NULL,
note VARCHAR(256),
PRIMARY KEY (id)
);
/*==============================================================*/
/* 外键约束 */
/*==============================================================*/
ALTER TABLE t_employee_task ADD CONSTRAINT FK_Reference_4 FOREIGN KEY (emp_id)
REFERENCES t_employee (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE t_employee_task ADD CONSTRAINT FK_Reference_8 FOREIGN KEY (task_id)
REFERENCES t_task (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE t_female_health_form ADD CONSTRAINT FK_Reference_5 FOREIGN KEY (emp_id)
REFERENCES t_employee (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE t_male_health_form ADD CONSTRAINT FK_Reference_6 FOREIGN KEY (emp_id)
REFERENCES t_employee (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE t_work_card ADD CONSTRAINT FK_Reference_7 FOREIGN KEY (emp_id)
REFERENCES t_employee (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
/*==============================================================*/
/* 插入测试数据 */
/*==============================================================*/
/*雇员表*/
INSERT INTO t_employee(id,real_name,sex,birthday,mobile,email,POSITION,note)
VALUES (DEFAULT,'employee_1',1,'2000-04-23','18773459883','employee_1@.com','Programmer','小刘');
INSERT INTO t_employee(id,real_name,sex,birthday,mobile,email,POSITION,note)
VALUES (DEFAULT,'employee_2',1,'2000-01-03','18773324883','employee_2@.com','Programmer','小王');
INSERT INTO t_employee(id,real_name,sex,birthday,mobile,email,POSITION,note)
VALUES (DEFAULT,'employee_3',0,'2000-02-20','18773443555','employee_3@.com','Programmer','小徐');
INSERT INTO t_employee(id,real_name,sex,birthday,mobile,email,POSITION,note)
VALUES (DEFAULT,'employee_4',0,'2000-04-29','18773464467',