mybatis 一对一映射

xml

<mapper namespace="com.oracle.dao.one2oneDao">
    <sql id="personColum"> id,name,gender,age</sql>
    <sql id="passportColum"> id ,bh,person_id</sql>
    <sql id="passportColum2"> id ,bh</sql>

    <resultMap type="com.oracle.pojo.Passport" id="passportResultMap">
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <result column="bh" property="bh" javaType="string" jdbcType="VARCHAR"/>
        <association property="person" column="person_id" javaType="com.oracle.pojo.Person" select="getPerson"></association>
    </resultMap>

    <select id="getPerson" parameterType="int" resultType="com.oracle.pojo.Person">
        select <include refid="personColum"></include>
        from t_person_fk
        where id=#{id}
    </select>

    <select id="getPassport" parameterType="int" resultMap="passportResultMap">
        select <include refid="passportColum"></include>
        from t_passport_fk
        where person_id=#{id}
    </select>
    <!-- ||||||||||||||||||||||||||||||||||| -->

    <resultMap type="com.oracle.pojo.Passport" id="passportResult">
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <result column="bh" property="bh" javaType="string" jdbcType="VARCHAR"/>
        <association property="person" column="person_id" javaType="com.oracle.pojo.Person" resultMap="personResult"></association>
    </resultMap>

    <resultMap type="com.oracle.pojo.Person" id="personResult">
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <result column="name" property="name" javaType="string" jdbcType="VARCHAR"/>
        <result column="gender" property="gender" javaType="string" jdbcType="VARCHAR"/>
        <result column="age" property="age" javaType="int" jdbcType="INTEGER"/>
    </resultMap>

    <select id="getPersonAndPassport" parameterType="int" resultMap="passportResult">
        select person.id,person.name,person.age,person.gender,
        passport.id,passport.bh
        from t_passport_fk passport left join
        t_person_fk person on passport.person_id = person_id
        where person.id=#{id}
    </select>
    <!-- |||||||||||||主键映射||||||||||||||||||| -->

    <select id="getPersonPK" parameterType="int" resultType="com.oracle.pojo.Person">
        select <include refid="personColum"></include>
        from t_person_pk
        where id=#{id}
    </select>

    <select id="getPassportPk" parameterType="int" resultMap="passportResultMapPK">
        select <include refid="passportColum2"></include>
        from t_passport_pk
        where id=#{id}
    </select>

    <resultMap type="com.oracle.pojo.Passport" id="passportResultMapPK">
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <result column="bh" property="bh" javaType="string" jdbcType="VARCHAR"/>
        <association property="person" column="id" javaType="com.oracle.pojo.Person" select="getPersonPK"></association>
    </resultMap>
    

Dao

public interface one2oneDao {
    //////////////////外键映射
    public Passport getPassport(int id);

    public Passport getPersonAndPassport(int id);

    ///////////////////////主键映射

    public Passport getPassportPk(int id);

}

Test

    public static void main(String[] args) {
        //获取数据源
        String resource = "mybatis.xml";
        InputStream inputStream=null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession session = sqlSessionFactory.openSession();

        one2oneDao one2onedao = session.getMapper(one2oneDao.class);

//        Passport passport = one2onedao.getPassport(2);
//        System.out.println(passport);

//        Passport passport = one2onedao.getPersonAndPassport(2);
//        System.out.println(passport);

//        Passport passportPk = one2onedao.getPassportPk(1);
//        System.out.println(passportPk);

        session.commit();
    }

}

sql

/*基于外键映射*/
CREATE TABLE t_person_fk
 (
     id NUMBER(10) PRIMARY KEY,
     name VARCHAR2(20) NOT NULL,
     gender VARCHAR2(10),
     age NUMBER(3) CHECK(age BETWEEN 1 AND 100)
 );

 CREATE TABLE t_passport_fk
 (
     id NUMBER(10) PRIMARY KEY,
     bh VARCHAR2(30) NOT NULL UNIQUE,
     person_id NUMBER(10) REFERENCES t_person_fk(id) UNIQUE
 );

 CREATE SEQUENCE t_person_fk_seq
 START WITH 1
 INCREMENT BY 1;

 CREATE SEQUENCE t_passport_fk_seq
 START WITH 1
 INCREMENT BY 1;

 /*基于主键映射*/
 CREATE TABLE t_person_pk
 (
     id NUMBER(10) PRIMARY KEY,
     name VARCHAR2(20) NOT NULL,
     gender VARCHAR2(10),
     age NUMBER(3) CHECK(age BETWEEN 1 AND 100)
 );

 CREATE TABLE t_passport_pk
 (
     id NUMBER(10) PRIMARY KEY REFERENCES t_person_pk(id),
     bh VARCHAR2(30) NOT NULL UNIQUE
 );

 CREATE SEQUENCE t_person_pk_seq
 START WITH 1
 INCREMENT BY 1;
时间: 2024-10-13 15:56:09

mybatis 一对一映射的相关文章

mybatis一对一映射配置详解

听说mybatis一对一有三种写法,今天我试了一下. 数据库表准备 为了偷懒,我直接就拿用户权限菜单里的菜单表和菜单与权限的中间表做实现,他们原来是多对多的关系,这边我假设这两张表是一对一. 表  gl_role_men:id,role_id,menu_id     --------->  实体类 GlrolemenuModel  private String id;private String roleId;private String menuId;private MenuModel men

mybatis一对一映射

1)如图 2)创建students.sql和cards.sql drop table students; drop table cards; create table cards( id int(5) primary key, num varchar(20) ); create table students( id int(5) primary key, name varchar(10), cid int(5), constraint cid_fk foreign key(cid) refere

MyBatis高级查询 一对一映射

drop database if exists simple; create database simple; use simple; drop table if exists sys_user; create table sys_user ( id bigint not null auto_increment comment '用户ID', user_name varchar(50) comment '用户名', user_password varchar(50) comment '密码',

mybatis一对一关联关系映射

mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加"一"的一方的主键作为外键. 多对多关系:产生中间表引入两张表的主键作为外键,将两个主键作为联合主键或者引入新的字段作为这个中间表的主键. 一对一关联关系 例如person和IDcard,一个人只有一个身份证号,而一个身份证号只对应一个人. 以上是person表和IDcard表. public

MyBatis系列:(6)一对一映射

0.准备SQL语句(mysql) CREATE TABLE cards(     cid INT(5) PRIMARY KEY,     cnum VARCHAR(18) ); CREATE TABLE students(     sid INT(5) PRIMARY KEY,     sname VARCHAR(10),     scard_id INT(5),     CONSTRAINT students_fk FOREIGN KEY(scard_id) REFERENCES cards(

(12)Hibernate一对一映射

只要你肯努力,没有什么事情是你不能搞砸的. 需求:一个汽车(Car)有一个引擎(Engine),它是一对一的映射关系. 对于一对一的映射,有两种实现方式:基于外键的映射和基于主键的映射.这两种方式学习的重点就是映射文件的配置,推荐使用第一种方式. 1.基于外键的映射 Car.java package com.rk.hibernate.k_one2one; public class Car { private int carId; private String carName; private E

【Hibernate步步为营】--单向关联一对一映射(一)

上篇文章对多对一的关联映射做了详细的分析,它在实现上可以有两种方式,并且这两种方式实现也很简单,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系,这种映射关系既是对象模型中的聚合关系.接下来继续讨论关联映射. 一.唯一外键 唯一外键说的是数据库表中的每一行的外键唯一对应着另一张表中的主键,也就是说一个表的主键作为另一张表的外键,并且它们之间的关系是唯一的,这种反应到关系模型中如下图所示: 上图的两个实体表,分别为人和身份证,很明显的一个人对应着一个身份证.身份证作为

mybatis中映射文件和实体类的关联性

mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~: 以User对象和UserMap.xml为例讲解,代码如下: User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略): import com.google.common.collect.Lists; import com.gukeer.common.persisten

hibernate笔记--基于主键的单(双)向的一对一映射关系

上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一映射关系应该这样配置: 新建一个IdCard实体类: public class IdCard { private int id; private String code; private Person p