欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis的一对一关联关系映射

程序员文章站 2022-07-09 19:47:00
原文链接:http://www.yiidian.com/mybatis/one to one.html 1 什么是一对一、一对多映射? 以用户和订单举例, 一对一 : 一个订单只属于一个用户 == 订单对用户是一对一关系 一对多 : 一个用户可以拥有多个订单 == 用户对订单是一对多关系 注意:在M ......

原文链接: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 插入测试数据

MyBatis的一对一关联关系映射

MyBatis的一对一关联关系映射

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对象的数据!

MyBatis的一对一关联关系映射

MyBatis的一对一关联关系映射

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

MyBatis的一对一关联关系映射

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