Mybatis多表查询

本文介绍了Java ORM框架中的一对多关系映射,以班级和学生为例,展示了如何在实体类中设置关联属性,并通过MyBatis进行多表查询。讨论了多表连接查询与多表单独查询的优缺点,强调了关联属性在多表查询结果映射中的作用。推荐使用多表单独查询以节省内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先。我们需要知道,表与表之间存在的几种关系:
一对一
一对多(多对一)
多对多

一对多:

举例:班级与学生

		class表:
		CREATE TABLE `class` (
  `id` int NOT NULL,
  `classid` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

在这里插入图片描述
students表:

CREATE TABLE `students` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `classId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `classId` (`classId`),
  CONSTRAINT `students_ibfk_1` FOREIGN KEY (`classId`) REFERENCES `class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

在这里插入图片描述
建立两个实体类:

  • 1.如果通过班级id查询该班学生情况。即通过class表查询students表,需要在class表对应的实体类中建立关联属性。即是将查询的结果全部映射在classs类
  • 2.如何想将查询后的结果映射到student属性,则需要在student类中设置关联属性
  • 3.下面的示例是将查询结果映射进classs对象中,关联属性设置在classs类中:

classs表:

public class classs {
    private int id;
    private String classid;
    //设置关联属性,由于class表与students表是一对多关系。该属性设置为集合类型
    private Set<Students> st; 
    public classs() {
    }

    public classs(String classid) {
        this.classid = classid;
    }

    public int getId() {
        return id;
    }

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

    public String getClassid() {
        return classid;
    }

    public void setClassid(String classid) {
        this.classid = classid;
    }

    public Set<Students> getSt() {
        return st;
    }

    public void setSt(Set<Students> st) {
        this.st = st;
    }

    @Override
    public String toString() {
        return "classs{" +
                "id=" + id +
                ", classid='" + classid + '\'' +
                ", st=" + st +
                '}';
    }
}

students表:

package org.example.pojo;

public class Students {
    private int id;
    private String name;

    public Students() {
    }

    public Students(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

在dao层的接口中

 Classs selectByStudentId(int id);
对于多表查询,有两种查询方式:
  • 多变连接查询
  • 多表单独查询
多表单独查询

  <select id="selectByStudentId" resultMap="selectBystudents">
        select id,classid from class where id=#{ha}
    </select>
	//通过id查询class表的相关属性,将结果封装到resultMap中
	
    <resultMap id="selectBystudents" type="org.example.pojo.classs">
        <id property="id" column="id"/>
        <result property="classid" column="classid"/>
        <collection property="st" column="id" ofType="Students" select="selectbyst"/>
    </resultMap>
    //对resultMap中的字段进行手动映射
    
    <select id="selectbyst" resultType="org.example.pojo.Students">
        select id,name from students where classId=#{id}
    </select>
    //将class表返回的id传到students表中查询相关属性
    
多表连接查询

 <select id="selectByStudentId" resultMap="classMap">
        select class.id As cId,classid,studnet.id As sId,name,from class left join on studnet.cid=class.id where student.id=#{ha}
 </select>
 <resultMap id="classMap" type="org.example.pojo.classs">
      <id property="id" column="cId"/>
      <result property="classid" column="classid"/>
      <collection property="st" ofType="Students">
        	<id property="id" column="sId"/>
        	<result property="name" column="sname"/>
     </collection>
 </resultMap>

type:对应的实体类
id:针对主键
result:普通属性
collection:关联属性
property:对应的实体类中的属性名
colum:数据库表中的列名
OfType:关联属性的的数据类型。如果是集合,应写集合内元素的类型。

总结:
  • 对于多表查询,关联属性决定着 查询结果 映射在哪个对象中
  • 多表查询连接查询相比多表单独查询,过程比较简单,但是比较消耗内存。所以还是推荐多表单独查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值