zoukankan      html  css  js  c++  java
  • MyBatis表设计

    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以学生表为主,关联关系表和课程表
  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/lhl0131/p/13476438.html
Copyright © 2011-2022 走看看