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

    两张表,学生表,地址表,学生表中的addressId对应地址表中的id。

    首先构建两个实体类,Student,Address

    package com.maya.model;
    
    public class Student {
        private int id;
        private String name;
        private int age;
        private Address address;
        
        
        
        public Address getAddress() {
            return address;
        }
        public void setAddress(Address address) {
            this.address = address;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        public Student(int id, String name, int age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public Student() {
            super();
        }
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
        }    
    }
    package com.maya.model;
    
    public class Address {
        private int id;
        private String sheng;
        private String shi;
        private String qu;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getSheng() {
            return sheng;
        }
        public void setSheng(String sheng) {
            this.sheng = sheng;
        }
        public String getShi() {
            return shi;
        }
        public void setShi(String shi) {
            this.shi = shi;
        }
        public String getQu() {
            return qu;
        }
        public void setQu(String qu) {
            this.qu = qu;
        }
        @Override
        public String toString() {
            return "Address [id=" + id + ", sheng=" + sheng + ", shi=" + shi + ", qu=" + qu + "]";
        }    
    }

    接下来我们先介绍以下3种不太常用的方式(当然平时做些小项目的话还是很直接很暴力的):

    1.

      <resultMap type="Student" id="StudentResult">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="age" column="age"/>
            
            <result property="address.id" column="addressId"/>
            <result property="address.sheng" column="sheng"/>
            <result property="address.shi" column="shi"/>
            <result property="address.qu" column="qu"/>
        </resultMap>

      当然这是最笨的一种办法,通过成员属性的属性来对应其数据库的字段

    2.

      <resultMap type="Student" id="StudentResult">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="age" column="age"/>
            <association property="address" javaType="Address">
                <result property="id" column="id"/>
                <result property="sheng" column="sheng"/>
                <result property="shi" column="shi"/>
                <result property="qu" column="qu"/>
            </association>
        </resultMap>
      
      通过直接在StudentMapper中的属性中定义association标签来实现
      property是属性,javaTye是引用的类型,紧接着将Address的属性也全部配置进来
     

    3.

      <resultMap type="Address" id="AddressResult">
            <result property="id" column="id"/>
            <result property="sheng" column="sheng"/>
            <result property="shi" column="shi"/>
            <result property="qu" column="qu"/>
        </resultMap>
        
        <resultMap type="Student" id="StudentResult">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="age" column="age"/>
            <association property="address" resultMap="AddressResult"/>
        </resultMap>

      在studentMapper中定义两个resultMapper,其实这种方式就算不错了,但是如果别的mapper也需要Address呢?很显然这就不是很实用了。
      当然这已经很接近我们常用的方法了。
      最常用的就是,再定义一个mapper接口和mapper映射,通过association属性来引入,具体代码如下:

    0.

    首先定义Address的接口与映射文件

    package com.maya.mappers;
    
    import com.maya.model.Address;
    
    public interface AddressMapper {
        //我们只需要定义这一个方法就ok,
        //因为当穿过来的Student的外键address时,这里接收的就是其主键值,这样我们就能查到student对应的地址了
        public Address getById(int id);
    }
    <?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">
    <mapper namespace="com.maya.mappers.AddressMapper">
        <!-- resultMap是要有的,大家都这么写,因为这样重用性高。用其它的方式当然也没错 -->
        <resultMap type="Address" id="AddressResult">
            <id property="id" column="id" />
            <result property="sheng" column="sheng" />
            <result property="shi" column="shi" />
            <result property="qu" column="qu" />
        </resultMap>
        
        <select id="getById" parameterType="int" resultMap="AddressResult">
            select * from address where id=#{id}
        </select>
        
    </mapper>

    下面是StudentMapper

        <!-- 通常当查询结果是一个集合的话,我们都会在这里定义一个resultMap,用来给下面的方法引用 -->
        <resultMap type="Student" id="StudentResult"><!-- type就是集合中的类型,id随便你怎么起 -->
            <id property="id" column="id"></id><!-- property是类的属性名,对应,column是数据库的字段名 -->
            <result property="name" column="name" />
            <result property="age" column="age" />
            <association property="address" column="addressId" select="com.maya.mappers.AddressMapper.getById"></association>
            <!-- property是属性名,column是外键列,select是对应的根据外键id寻找其表中数据的方法 -->
        </resultMap>

    Junit测试结果

  • 相关阅读:
    认证和授权学习2:springboot中快速使用spring security
    认证和授权学习1基于session的认证授权流程
    activiti学习11历史表和历史查询
    activiti学习10任务监听器的使用
    Vue源码阅读之VNode虚拟DOM(二)
    Vue源码阅读之Vue构造函数(一)
    useEffect使用指南
    从零搭建React+TypeScript的后台项目(三)
    从零搭建React+TypeScript的后台项目(二)
    从零搭建React+TypeScript的后台项目(一)
  • 原文地址:https://www.cnblogs.com/AnswerTheQuestion/p/6736695.html
Copyright © 2011-2022 走看看