MyBatis 一对多设计
1.表设计
员工(n)和部门(1)表 设计1 和 n的表关系: 将外键添加在n的一方 --## 部门表 create table t_dept( id varchar2(36) primary key, name varchar2(50) ); --## 员工表 create table t_emp( id varchar2(36) primary key, name varchar2(50), age number(3), salary number(10,2), dept_id references t_dept(id) ); 重点:必须先添加没有外键的数据(部门),然后再添加存在外键的数据(员工)
2.实体设计
1.在实体的添加关系属性,用来表示实体之间的关系(对应表数据的关系) 2.在N的一方添加1的一个关系属性 3.在1的一方添加N的list集合关系属性 public class Emp { //主属性 private String id; //一般属性 private String name; private Integer age; private Double salary; //关系属性 一个部门信息 private Dept dept; } public class Dept { private String id; private String name; //关系属性 员工信息 private List<Emp> emps; }
3. DAO(使用MyBatis查询两张表)
需求1:根据员工工号查询该员工信息(1对1) DAO接口 Emp selectById(String id); Mapper文件 1.SQL(必须使用表链接) select e.id,e.name,e.age,e.salary,d.id as did, d.name as dname from t_emp e left join t_dept d on e.dept_id = d.id where e.id = '5'; 2.参数 3.使用ResultMap映射成实体对象association(1对1) <!-- 关系属性 是1的时候使用 --> <association property="关系属性名dept" javaType="关系属性的类型com.lhl.demo3.Dept"> <id property="id" column="did"/> <result property="name" column=" dname"/> </association>
需求2:根据id查询部门信息,和内部的员工信息(1对多) DAO接口设计 Dept selectById(String id); Mapper文件中 1.SQL设计(使用表链接) select d.id, d.name, e.id as eid, e.name as ename, e.age, e.salary from t_dept d left join t_emp e on d.id = e.dept_id where d.id = #{id} 2.参数绑定 3.collection关系映射(1对多) <!-- 关系属性 :list集合--> <collection property="集合关系属性名emps" ofType="关系属性对象单个类型com.lhl.demo3.Emp"> <!-- 主属性 --> <id property="id" column="eid"/> <!-- 一般属性 --> <result property="name" column="ename"/> <result property="age" column="age"/> <result property="salary" column="salary"/> </collection>
1对1设计
1.表设计
1.添加外键 从业务分析角度,后添加的数据对应的表 该表叫做子表(副表),添加外键
2.外键列约束 unique 唯一,不能重复
2.实体设计
互相保留彼此的一个关系属性
3.DAO设计
映射结果使用 <association></association>
多对多设计
1.库表设计
创建第三张关系表关联起来 --学生表 create table t_student( id varchar2(36) primary key, name varchar2(50), age number(3), mobile varchar2(11) ); --课程表 create table t_course( id varchar2(36) primary key, name varchar2(50) ); --选课表 create table t_stu_course( sid references t_student(id), cid references t_course(id), primary key(sid,cid)--联合主键 特点是非空并且联合唯一 ); 注意: 如果产品要求一个学生选一个课,只能选择一次 可以使关系表中,联合两个外键作为主键
2.实体设计
互相保留对方的一个集合属性 //学生实体 public class Student{ //主属性 private String id; //一般属性 private String name; private Integer age; private String moblie; //关系属性 private List<Course> courses; } //课程实体 public class Course { //主属性 private String id; //一般属性 private String name; //关系属性 private List<Student> students; }
3.DAO设计
本质就是 1对n 使用list集合关系属性 <collection>标签 sql以学生表为主,关联关系表和课程表