首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MyBatis-多表查询(一对一)

MyBatis-多表查询(一对一)

作者头像
星哥玩云
发布于 2022-09-14 13:29:29
发布于 2022-09-14 13:29:29
37400
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

1、多表查询(一对一)

1.1、使用多表查询前的准备

学生表(students):

班级表(classes):

1.2、需求分析(一对一)

查询所有学生信息,关联查询下班级信息。

注意:

因为一个学生信息只能在一个班级里,所以从查询学生信息出发关联查询班级信息为一对一查询。

如果从班级信息出发查询班级下的学生信息则为一对多查询,因为一个班级可以有多个学生。

方式一SQL 如下:

select s.*,c.cname from students s,classes c where s.cid=c.cid;

方式二SQL如下:

select s.sid,s.sname,s.ssex,s.sage,c.* from students s,classes c where s.cid=c.cid

2、案例实现-方式一

2.1、编写实体类文件

Students.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tyschool.mb005.javabean;

import java.io.Serializable;

public class Students implements Serializable {
    private int sid;
    private String sname;
    private String ssex;
    private int sage;

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getSsex() {
        return ssex;
    }

    public void setSsex(String ssex) {
        this.ssex = ssex;
    }

    public int getSage() {
        return sage;
    }

    public void setSage(int sage) {
        this.sage = sage;
    }

    @Override
    public String toString() {
        return "Students{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", ssex='" + ssex + '\'' +
                ", sage=" + sage +
                '}';
    }
}

Classes.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.Serializable;

public class Classes implements Serializable {
    private int cid;
    private String cname;

    public int getCid() {
        return cid;
    }

    public void setCid(int cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "Classes{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                '}';
    }
}

2.2、定义返回值接收类文件

StudentsClasses.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.Serializable;

public class StudentsClasses extends Students implements Serializable {
    private String cname;

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "StudentsClasses{" +
                "cname='" + cname + '\'' +
                '}';
    }
}

2.3、创建IStudentsDao.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.tyschool.mb005.javabean.StudentsClasses;

import java.util.List;

public interface IStudentsDao {
    List<StudentsClasses> findAll();
}

2.4、创建IStudentsDao.xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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.tyschool.mb005.students.dao.IStudentsDao">
<select id="findAll" resultType="com.tyschool.mb005.javabean.StudentsClasses">
        select s.*,c.cname from students s,classes c where s.cid=c.cid
    </select>
</mapper>

注意:

写好的IStudentsDao.xml文件要在SqlMapConfig.xml中加入映射

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<mappers>
        <mapper resource="com/tyschool/mb005/user/dao/IStudentsDao.xml"></mapper>
</mappers>

2.5、创建测试类MbStudentsTest.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tyschool.mb005.test;

import com.tyschool.mb005.javabean.StudentsClasses;
import com.tyschool.mb005.students.dao.IStudentsDao;
import com.tyschool.mb005.user.dao.IUserDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MbStudentsTest {
    private InputStream in;
    private SqlSession session;
    private IStudentsDao studentsDao;
    @Test
    public void findAll(){
        List<StudentsClasses> list=studentsDao.findAll();
        for(StudentsClasses sc :list){
            System.out.println(sc);
        }
    }
    @Before
    public void init()throws IOException {
        in= Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        SqlSessionFactory factory=builder.build(in);
        session=factory.openSession();
        studentsDao=session.getMapper(IStudentsDao.class);
    }
    @After
    public void destroy() throws IOException {
        session.commit();;
        session.close();
        in.close();
    }
}

3、案例实现-方式二

使用resultMap,定义专门的resultMap用于映射一对一查询结果。 通过面向对象的关系可以得知,我们可以在Students类中加入一个Classes类的对象来代表这个学生是哪个班级的。

3.1、修改Students.java文件

加入Classes对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Classes classes;

public Classes getClasses() {
        return classes;
}

public void setClasses(Classes classes) {
        this.classes = classes;
}

3.2、修改IStudentsDao.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.tyschool.mb005.javabean.Students;
import com.tyschool.mb005.javabean.StudentsClasses;

import java.util.List;

public interface IStudentsDao {
    List<StudentsClasses> findAll();
    List<Students> findAll1();
}

3.3、修改IStudentsDao.xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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.tyschool.mb005.students.dao.IStudentsDao">
    <resultMap id="studentsMap" type="com.tyschool.mb005.javabean.Students">
        <id column="sid" property="sid"></id>
        <result column="sname" property="sname"></result>
        <result column="ssex" property="ssex"></result>
        <result column="sage" property="sage"></result>
        <association property="classes" javaType="com.tyschool.mb005.javabean.Classes">
            <id column="cid" property="cid"></id>
            <result column="cname" property="cname"></result>
        </association>
    </resultMap>
    <select id="findAll" resultType="com.tyschool.mb005.javabean.StudentsClasses">
        select s.*,c.cname from students s,classes c where s.cid=c.cid
    </select>
    <select id="findAll1" resultMap="studentsMap">
        select s.sid,s.sname,s.ssex,s.sage,c.* from students s,classes c where s.cid=c.cid
    </select>
</mapper>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MyBatis-多表查询(一对多)
班级信息和他的学生信息为一对多关系,并且在查询班级的信息过程中查询出学生信息。我们想到了左外连接查询比较合适。
星哥玩云
2022/09/14
9810
MyBatis-多表查询(多对多)
老师信息与学生信息为多对多的关系,一个学生有多个老师,一个老师同样可以有多个学生。要想知道老师下的学生信息,不能直接查到我们的学生信息,只能通过中间表(tors)才能关联到学生信息。
星哥玩云
2022/09/14
1.6K0
MyBatis-多表查询(多对多)
MyBatis-延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
星哥玩云
2022/09/14
1.1K0
MyBatis注解(单表)
1、MyBatis注解开发前的准备 1.1、MyBatis常用注解 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result 一起使用,封装多个结果集 @ResultMap:实现引用@Results 定义的封装 @One:实现一对一结果集封装 @Many:实现一对多结果集封装 @SelectProvider: 实现动态SQL映射 @CacheNamespace:实现注解二级缓存的使
星哥玩云
2022/09/14
2940
MyBatis 详解(一对一,一对多,多对多)
1、什么是MyBatis?   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,
IT可乐
2018/01/04
5.5K0
MyBatis 详解(一对一,一对多,多对多)
MyBatis注解(多表)
@Result(column=" “,property=”",one=@One(select=""))
星哥玩云
2022/09/14
5750
MyBatis 多表操作
  关系数据库中第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。
Demo_Null
2020/09/28
3650
MyBatis 多表操作
详解Mybatis一对多、多对一、多对多
是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。简单说来就是关系型数据库用了选择、投影、连接、并、交、差、除、增删查改等数学方法来实现对数据的存储和查询。可以用SQL语句方便的在一个表及其多个表之间做非常复杂的数据查询。安全性高。
utopia
2023/03/21
1.9K0
Mybatis【关联映射】
Mybatis【多表连接】 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联起来的…那么在我们Mybatis中又怎么做呢??? 先来回顾一下我们SQL99的语法: 一)内连接(等值连接):查询客户姓名,订单编号,订单价格 --------------------------------------------------- select c.name,o.isbn,o.price fr
Java3y
2018/03/15
9900
Mybatis【关联映射】
【愚公系列】2023年03月 Java教学课程 118-Mybatis(多表操作)
多表模型是一种关系型数据库设计模式,它使用多个表格来存储和管理数据。在多表模型中,每个表格都包含一组相关的数据,并使用外键等关系来与其他表格建立连接。这种模型通常用于处理复杂的数据结构,例如具有多个关系的实体或需要动态添加或删除属性的实体。
愚公搬代码
2023/04/04
6890
【愚公系列】2023年03月 Java教学课程 118-Mybatis(多表操作)
MyBatis一对多,多对一(图文并茂)
链接:https://pan.baidu.com/s/1FX4TmyKqZQx39ncn8TItfw 密码:1h1i
CBeann
2023/12/25
2890
MyBatis一对多,多对一(图文并茂)
Mybatis 注解
  我们可以看到,明明结果已经查询出来了,为什么打印出来却是空的。这个是因为属性名和列名不一致造成的,类似于我们这种 sId ☞ s_id 可以打开驼峰之自动转换。如果二者之间没有任何联系就需要使用 @Results 一一映射。
Demo_Null
2020/09/28
3590
Mybatis 注解
Spring入门
Spring 是一个主流的 Java Web 开发框架,该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力。Spring 以 IoC(Inverse of Control,控制反转)和 AOP(Aspect Oriented Programming,面向切面编程)为内核。
星哥玩云
2022/09/14
8040
Spring入门
Mybatis【19】-- Mybatis自关联多对多查询
注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-15-oneself-many2many,需要自取,需要配置maven环境以及mysql环境(sql语句在resource下的test.sql中),觉得有用可以点个小星星。
秦怀杂货店
2021/02/23
9440
MyBatis_resultMap 的关联方式实现多表查询(多对一)
项目结构 1.实体类 2.Mapper层 3.service层 4.工具层 5.测试层 项目截图 1、实体类 创建班级类(Clazz)和学生类(Student),添加相应的方法。
时间静止不是简史
2020/07/26
1.4K0
SQL笔试50题(下)
阅读原文,或者访问该链接可以在线观看(该系列将更新至GitHub,并且托管到read the docs)
fireWang
2020/02/18
1K0
_Mybatis关联查询【附实战案例】
会洗碗的CV工程师
2023/11/20
2100
_Mybatis关联查询【附实战案例】
java进阶|Mybatis系列文章(三)表关联查询操作
整个项目所需要的xml文件进行数据的增删改查操作ClassesMapper.xml文件
码农王同学
2020/04/27
8440
SQL笔试50题(上)
本节内容,我们使用在入门内容部分介绍的在线SQL平台sql fiddle进行测试。
fireWang
2020/02/18
8710
mybatis多对一和一对多查询数据处理解读
MyBatis 的一对多、多对一,主要就是 resultMapresultMapresultMap 两个属性的使用,而一对多和多对一都是相互的,只是站的角度不同:
一个风轻云淡
2023/10/15
7750
mybatis多对一和一对多查询数据处理解读
相关推荐
MyBatis-多表查询(一对多)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档