关于Mybatis中 多对一查询 <association>各参数深入分析

一、多对一的情况,其实就是SQL语句中的多表查询


这里以产品订单数据表 Bill 中的供应id号,查询 供应商Provider表中对应idproName 名字


1.BillMapper中的方法标签

//根据输入的订单号进行模糊查询,与此订单供应商相同的所有订单
	List<Bill> getBillList(Bill bill);

2.BillMapper.xml中的设置

<select id="getBillList" parameterType="Bill" resultMap="getProviderName">
   select * from smbms.smbms_bill where providerId=#{providerId}
</select>

<resultMap id="getProviderName" type="Bill">
   <association property="provider" column="providerId" javaType="Provider"
                select="getProvider">
   </association>
</resultMap>

<select id="getProvider" resultType="Provider">
   select id,proName from smbms.smbms_provider where id = #{providerId};
</select>

1. resultMap中的映射表示,

<resultMap id="getProviderName" type="Bill">
   <association property="provider" column="providerId" javaType="Provider"
                select="getProvider">
   </association>
</resultMap>

输入的类型type是(多:比如学生 )type="Bill"
想要得到的类型javaType(一:比如老师) javaType="Provider"
此时的column 代表你希望依据Bill表中的哪一列进行多对一在Provider中查找,也就是嵌套select语句中

<select id="getProvider" resultType="Provider">
   select id,proName from smbms.smbms_provider where id = #{providerId};
</select>

#{providerId} 取的值,此时的语句,#{}里面其实无论些写什么,都会自动推测对应
column="providerId",所以说里面写什么不重要

association的property="provider"

<resultMap id="getProviderName" type="Bill">
 <association property="provider" column="providerId" javaType="Provider"
              select="getProvider">
 </association>
</resultMap>

其实会根据属性“provider” 在 type="Bill"类中查找属性类型设置为我们从表中查到的的内容,所以 Bill表格中对应的实体类Bill中需要时 provider实体类,才能在结果直接将查到的Provider类赋值给他,不然报错类型赋值异常,比如要将结果Provider provider 赋值给 String providerName


3. 实体类如下

package cn.smbms.pojo;

import java.math.BigDecimal;
import java.util.Date;

public class Bill {
	private Integer id;   //id 
	private String productName; //商品名称 
	private Provider provider;//供应商,此时设定为一个类,这个类我们不需要显示在Bill数据库中

	public String getProviderName() {
		return provider.getProName();
	}
	public void setProviderName(String providerName) {
		provider.setProName(providerName);
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
}

二、简单理解,老师和学生的例子实体类

package pojo;

/**
 * @author Sommer1111
 * @date 2021/3/2 16:58
 */
public class Student {
    private int id;
    private String name;
    private Teacher teacher;



    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 Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    public Student(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }

    public Student() {
    }
}

package pojo;

/**
 * @author Sommer1111
 * @date 2021/3/2 16:59
 */
public class Teacher {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    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 Teacher() {
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

1.studentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dao.StudentMapper">
    <select id="getStudent" resultMap="StudentToTeacher">
        select * from mybatis.student
    </select>
    <resultMap id="StudentToTeacher" type="Student">
        <result property="id" column="id"></result>
        <result property="name" column="name"></result>
        <association property="teacher" column="tid" javaType="Teacher"
                     select="getTeacher">
        </association>

    </resultMap>

    <select id="getTeacher" resultType="Teacher">
        select * from mybatis.teacher where id = #{id};
    </select>
</mapper>

3.学生的数据库表中并没有 teacher这个列

在这里插入图片描述

4. 取出来的数据

在这里插入图片描述


版权声明:本文为qq_42647903原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。