美文网首页
MyBatis的一对一关联关系映射

MyBatis的一对一关联关系映射

作者: 一点教程网 | 来源:发表于2020-03-21 08:11 被阅读0次

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

    file file

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

    file file

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

    file

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

    相关文章

      网友评论

          本文标题:MyBatis的一对一关联关系映射

          本文链接:https://www.haomeiwen.com/subject/xrgeyhtx.html