Mybatis学习笔记 4:Mybatis 连表查询(一)——一对多关系

本文详细介绍了如何使用MyBatis进行一对多查询,包括创建数据表、JavaBean类,编写SQL语句及resultMap配置,最后通过测试代码验证查询结果。

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

完整代码在这

在查询数据库时,我们经常会遇到多张表联合查询的情况,而Mybatis使连表查询更加简便了,查询出的数据格式非常易于使用,省去了一大部分复杂的代码编写工作,对于关系型数据库来说,数据模型之间通常存在一对多,多对一,多对多三种情况,下面先开始介绍一对多查询。

一、准备工作

1. 新建两张数据表 class_ 表和student表,并添加上数据。

其中一个class_表的记录对应多个student的记录,是一对多关系。

2. 新建对应的Javabean

Student类:

package com.learn.pojo;

public class Student {
    private String stu_id;
    private String stu_name;
    private String stu_major;

    public String getStu_id() {
        return stu_id;
    }

    public void setStu_id(String stu_id) {
        this.stu_id = stu_id;
    }

    public String getStu_name() {
        return stu_name;
    }

    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }

    public String getStu_major() {
        return stu_major;
    }

    public void setStu_major(String stu_major) {
        this.stu_major = stu_major;
    }

    @Override
    public String toString(){
        return "Student : [" + stu_id + "  " + stu_name + "  " + stu_major + "]";
    }
}

复制代码

Class_类:

package com.learn.pojo;

import java.util.List;

public class Class_ {
    private int class_id;
    private String class_name;
    private String class_prop;
    //保存学生信息
    List<Student> students;

    public int getClass_id() {
        return class_id;
    }

    public void setClass_id(int class_id) {
        this.class_id = class_id;
    }

    public void setClass_name(String class_name) {
        this.class_name = class_name;
    }

    public String getClass_name() {
        return this.class_name;
    }

    public String getClass_prop() {
        return class_prop;
    }

    public void setClass_prop(String class_prop) {
        this.class_prop = class_prop;
    }

    public List<Student> getStudents() {
        return students;
    }

    @Override
    public String toString() {
        return "class : [" + class_id + "  " + class_name + "   " + class_prop + "]";
    }

}
复制代码

代码中students变量用来保存查询到的学生信息。

这两个类都重载了toString函数,便于打印信息。

二、sql语句准备

现在假设有一个需求,查询出所有的班级信息以及其对应的所有学生信息。

那么Sql语句应该这样写:

SELECT
	c.class_id cid,
	c.class_prop cprop,
	s.stu_id sid,
	s.stu_major smajor,
	s.class_id sid,
	c.class_name cname,
	s.stu_name sname
FROM
	class_ c
LEFT JOIN student s ON c.class_id = s.class_id
复制代码

sql语句查询结果:

在查询结果中有三列来自class_表,四列来自student表。

而对于select的resultType来说,直接用Class_是会报错的,mybatis并不能把查询结果直接装入Class_类型的对象,所以在这里就要用到resultMap了。

首先先新建一个叫做class_.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">

<mapper namespace="com.learn.pojo">
   <resultMap id="classResult" type="Class_">
       <id property="class_id" column="cid"/>
       <result column="cname" property="class_name"/>
       <result column="cprop" property="class_prop"/>
       
       <collection property="students" ofType="student">
           <id column="scid" property="class_id"/>
           <result property="stu_id" column="sid"/>
           <result column="sname" property="stu_name"/>
           <result column="smajor" property="stu_major"/>
       </collection>
            
   </resultMap>
    <select id="listClass" resultMap="classResult">
        select c.class_id cid, c.class_prop cprop, s.stu_id sid, s.stu_major smajor, s.class_id sid, c.class_name cname, s.stu_name sname from class_ c left join student s on c.class_id = s.class_id
    </select>
</mapper>
复制代码

在resultMap标签的属性中,id用来标识这种可返回的类型映射,type用来声明这种resultMap的类型。

在resultMap的子标签中有一个collection标签,用来定义返回的查询结果中的student对象的集合,然后对应的select标签中resultType标签改成resultMap就可以了。

三、测试代码:

测试代码很简单,跟之前调用基础的CURD操作一样:

        List<Class_> ls = session.selectList("listClass");
        for (Class_ c : ls) {
            System.out.println(c);
            List<Student> ss = c.getStudents();
            for (Student s : ss) {
                System.out.println("\t"+s);
            }
        }
复制代码

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值