zoukankan      html  css  js  c++  java
  • 0049 MyBatis关联映射--一对一关系

    世上的事务总不是孤立存在的,表现在Java类里面,则是类与类之间的关系,比如继承is-a、依赖use-a、关联has-a,反映在数据库中,则是表与表之间的关系,比如外键

    关联关系存在着以下几种类型:一对一关系;一对多和多对一关系;多对多关系

    一对一关系:
        对象A和对象B一一对应,最直观的例子:人和身份证的关系,一个人只拥有一张身份证,而一张身份证只会属于一个人
    一对多和多对一关系:
        一个班级可以有多个学生;一个人可以有多本书;一个用户可以有多个订单
    多对多关系:
        用户和商品:多个用户可以购买同一种商品;一个用户也可以购买多种商品

    MyBatis可以处理这几种关联关系

    比如一个身份证表和一个人的表,查询一个人的时候,顺便就把他的身份证信息查出来,看下面的sql:

    DROP TABLE IF EXISTS `idc`;
    CREATE TABLE idc(
        `pk` INT PRIMARY KEY AUTO_INCREMENT,
        `id` VARCHAR(18) UNIQUE,
        `name` VARCHAR(24),
        `address` VARCHAR(64),
        `birth` DATE
    );
    INSERT INTO idc(`id`,`name`,`address`,`birth`) VALUES('123456198501018376','王老五','A省B县','1985-01-01');
    INSERT INTO idc(`id`,`name`,`address`,`birth`) VALUES('123456198304018376','郭小二','X省Y县','1983-04-01');
    INSERT INTO idc(`id`,`name`,`address`,`birth`) VALUES('123456198807218376','李三','M省N县','1988-07-21');
    
    DROP TABLE IF EXISTS `person`;
    CREATE TABLE person(
        `pk` INT PRIMARY KEY AUTO_INCREMENT,
        `name` VARCHAR(24),
        `age` INT,
        `salary` INT,
        `idc_pk` int UNIQUE,
        FOREIGN KEY (idc_pk) REFERENCES idc(pk)   /*将身份证idc表的主键作为人person表的外键*/
    );
    INSERT INTO person(`name`,`age`,`salary`,`idc_pk`) VALUES('王老五','32','7550','1');
    INSERT INTO person(`name`,`age`,`salary`,`idc_pk`) VALUES('郭小二','34','8350','2');
    INSERT INTO person(`name`,`age`,`salary`,`idc_pk`) VALUES('李三','29','5150','3');
    

    实体类Person和IDC

    package net.sonng.onetoone;
    
    public class Person {
        private int pk;
        private String name;
        private int age;
        private int salary;
        private IDC idc;      //注意这跟表的idc_pk没有对应,而是映射到idc表里面的一条身份证信息记录
        //省略getter和toString
    }
    
    package net.sonng.onetoone;
    
    public class IDC {
        private int pk;
        private String id;
        private String name;
        private String address;
        private String birth;
        //省略getter和toString
    }
    

    下面是sql语句

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
    <mapper namespace="net.sonng.onetoone.PersonDao">
        <!-- 根据主键查询一条身份证信息 -->
        <select id="selectIDCByPk" parameterType="int" resultType="net.sonng.onetoone.IDC">
            SELECT * FROM idc WHERE pk=#{id}
        </select>
        <!-- 根据主键查询一个人,但不是直接映射到Person -->
        <select id="selectPersonByPk" parameterType="int" resultMap="personMap">
            SELECT * FROM person WHERE pk=#{id}
        </select>
        
        <resultMap type="net.sonng.onetoone.Person" id="personMap"> <!-- 这个resultMap将数据库记录映射为一个Person对象 -->
            <id property="pk" column="pk" />                        <!-- id属性表示主键,result属性非主键 -->
            <result property="name" column="name" />
            <result property="salary" column="salary" />
            <result property="age" column="age" />
                <!-- 注意下行:将查询结果的idc_pk列的数据作为参数,用『selectIDCByPk』这条sql,到idc表中查询出一条记录,再封装成一个IDC对象,赋值给Person对象的idc属性。 -->
            <association property="idc" column="idc_pk" select="selectIDCByPk" javaType="net.sonng.onetoone.IDC" />
                <!-- Person对象的属性名  person表的字段名    用哪条sql          结果封装成哪个类的对象 -->
                <!-- 用association属性完成了一对一的关联映射 -->
        </resultMap>
    </mapper>
    

    PersonDao略
    测试类:

    package net.sonng.test;
    
    import net.sonng.onetoone.Person;
    import net.sonng.onetoone.PersonDao;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
        public static void main(String[] args){
            ApplicationContext ac=new ClassPathXmlApplicationContext("ac.xml");
            PersonDao personDao=ac.getBean("personDao",PersonDao.class);
            
            Person per=personDao.selectPersonByPk(2);
            System.out.println(per);
            System.out.println(per.getIdc());
        }
    }
    
    
  • 相关阅读:
    Sublime Text 3 格式化HTML CSS JS 代码
    CSS 温故而知新
    JQuery Mobile 学习笔记
    Eclipse ADT 代码注释模版
    Eclipse ADT 与VS 常用的快捷键 对比学习
    元组、文件、以及其他
    类型与运算
    python
    python 内置函数 lamda表达式。 open 文件方法
    python 基础 基本数据类型
  • 原文地址:https://www.cnblogs.com/sonng/p/6610646.html
Copyright © 2011-2022 走看看