MyBatis的一对一关联关系映射

原文链接:http://www.yiidian.com/mybatis/one-to-one.html

1 什么是一对一、一对多映射?

以用户和订单举例,

一对一 : 一个订单只属于一个用户 ==> 订单对用户是一对一关系

一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系

注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射!

接下来先讲解MyBatis的一对一映射如何实现。

2 建立表结构

2.1 创建用户表

CREATE TABLE `t_user` (
   `id` int(11) DEFAULT NULL,
   `username` varchar(50) DEFAULT NULL,
   `password` varchar(50) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.2 创建订单表

CREATE TABLE `t_order` (
   `id` int(11) DEFAULT NULL,
   `orderno` varchar(100) DEFAULT NULL,
   `amount` double DEFAULT NULL,
   `user_id` int(11) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.3 插入测试数据

3 设计Pojo实体,建立关系

3.1 用户实体类

package com.yiidian.domain;

import java.util.List;

/**
 * 用户实体
 * 一点教程网 - www.yiidian.com
 */
public class User {
    private Integer id;
    private String username;

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3.2 订单实体类

package com.yiidian.domain;

/**
 * 订单实体
 * 一点教程网 - www.yiidian.com
 */
public class Order {
    private Integer id;
    private String orderno;
    private Double amount;
    private User user;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getOrderno() {
        return orderno;
    }

    public void setOrderno(String orderno) {
        this.orderno = orderno;
    }

    public Double getAmount() {
        return amount;
    }

    public void setAmount(Double amount) {
        this.amount = amount;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

Order实体类,通过user属性建立跟User实体的关系。注意,这里是一个User。

4 编写Dao接口

4.1 UserDao接口

package com.yiidian.dao;

import com.yiidian.domain.User;

import java.util.List;

/**
 * 用户Dao接口
 * 一点教程网 - www.yiidian.com
 */
public interface UserDao {

}

4.2 OrderDao接口

package com.yiidian.dao;
import com.yiidian.domain.Order;
import com.yiidian.domain.User;
import java.util.List;

/**
 * 订单Dao接口
 * 一点教程网 - www.yiidian.com
 */
public interface OrderDao {
    /**
     * 查询所有订单
     */
    public List<Order> findAllOrders();
}

5 编写Dao映射配置

5.1 UserDao.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
   namespace: 用于指定该映射文件需要映射的Dao接口
-->
<mapper namespace="com.yiidian.dao.UserDao">

</mapper>

5.2 OrderDao.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
   namespace: 用于指定该映射文件需要映射的Dao接口
-->
<mapper namespace="com.yiidian.dao.OrderDao">

    <!--一对一映射-->
    <resultMap id="OrderResultMap" type="com.yiidian.domain.Order">
        <id property="id" column="oid"/>
        <result property="orderno" column="orderno"/>
        <result property="amount" column="amount"/>
        <!--关联查询订单所属的用户-->
        <association property="user" column="id" javaType="com.yiidian.domain.User">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="password" column="password"/>
        </association>
    </resultMap>

    <select id="findAllOrders" resultMap="OrderResultMap">
        SELECT
          o.id oid,
          o.orderno orderno,
          o.amount amount,
          u.*
        FROM t_order o
          LEFT JOIN t_user u
            ON o.user_id = u.id
    </select>
</mapper>
  • association:用在一对一关联映射
  • property:对应Order类的user属性
  • column:对应外键字段名称
  • javaType:User类的全限定名称

6 编写测试类

package com.yiidian.mybatis;

import com.yiidian.dao.OrderDao;
import com.yiidian.domain.Order;
import com.yiidian.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * MyBatis测试类 - 一对一映射
 * 一点教程网 - www.yiidian.com
 */
public class TestOne2One {

    /**
     * 测试一对一映射
     */
    @Test
    public void testOrderDao(){
        //1.获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSession();

        //2.创建Mapper代理对象
        OrderDao orderDao = sqlSession.getMapper(OrderDao.class);

        //3.调用方法
        List<Order> list = orderDao.findAllOrders();
        System.out.println(list);
        //4.关闭连接
        sqlSession.close();
    }

}

7 运行测试类

以debug模式启动测试类,查看list变量的情况,可以看到Order对象中成功封装了User对象的数据!

源码下载:https://pan.baidu.com/s/1jZrfapjqB_VHI_GLgKPo4g

欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com

原文地址:https://www.cnblogs.com/yiidian/p/12536428.html

时间: 2024-10-31 01:17:38

MyBatis的一对一关联关系映射的相关文章

mybatis一对一关联关系映射

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

Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/Annotation) 联合主键 一对一单向外键联合主键(Xml/Annotation) 一对一组件关联(XML/Annotation) 理解组件 领域驱动设计——自动生成数据库脚本 一对一关系的小结 一些出错问题的总结 自动生成数据库脚本 一般在项目开发过程中,我们的习惯是先建好数据库和表,然后在进

mybatis中一对一关系映射

一对一关系中普通的配置方式 一.多表连接查询语句: <select id="selectStudentWithAddress" parameterType="int" resultMap="StudentWithAddressResult"> select s.stud_id, s.name, s.email,s.dob,s.phone, a.addr_id, a.street, a.city, a.state, a.zip,a.co

Hibernate关联关系映射之一对一关联关系

人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package entity; public class Person {     private Integer id;     private String name;     pr

MyBatis应用开发(13)映射之一对一关联

1.1.1. 一对一单向关联 resultMap可以定义实体之间的一对一关联关系.本文将介绍如何实现Person和IdCard之间的一对一单向关联关系.假定在业务逻辑上存在这样的约束:IdCard的personid属性应该等于Person的id属性,一个Person唯一对应于一个IdCard. 目标:Person可以通过idCard属性导航到IdCard,而IdCard不能通过person属性导航到Person. Person类: /** * @Title: Person.java * @Pac

mybatis 一对一关联映射实例

在实际项目开发中,经常存在一对一的关系,如一个人对应一张身份证信息,这就是一对一的关系.下面是一个简单的实例: 1.建表过程我就省略了,主要是一张Person表,一张IDCard表,其相关属性见步骤2Pojo类属性所示: 2.建立一个Person对象和一个IDCard对象: mybatis/pri/xiaoyang/otot/pojo/IDCard.java 1 public class IDCard implements Serializable { 2 private int id; //

Hibernate映射一对一关联关系

映射一对一关联 Hibernate提供了两种映射一对一关联关系的方式,分别是按照外键映射和按照主键映射. 下面是员工表和档案信息表(员工和档案表之间的关系是一对一的关系)  档案表(dept) 1 public class Dept { 2 private Integer deptid; 3 private String mystreet; 4 private Emp emp; 5 6 public Dept() { 7 } 8 9 public Dept(Integer deptid, Str

Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键. 创建User.java: 用户和身份证一对一的关联关系映射       private IdCart idCart; IdCart.java: 身份证和用户,一对一的关系       private User user; 1 package com.bie.bean; 2

JPA学习笔记(9)——映射双向一对一关联关系

双向一对一关联关系 一个部门有一个经理,一个经理管一个部门 Department实体类 package com.jpa.helloworld2; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; impo