mybatis多对一和一对多查询数据处理解读(上)

简介: mybatis多对一和一对多查询数据处理解读

概述

MyBatis 的一对多、多对一,主要就是 resultMapresultMapresultMap 两个属性的使用,而一对多和多对一都是相互的,只是站的角度不同:

  • 【一对多】association:一个复杂的类型关联。许多结果将包成这种类型
  • 【多对一】collection:复杂类型的集合

准备工作

由于本文是作为解读处理,在这里将不再赘述工程的搭建,只在这里只带大家过一下我们准备的实体类和pojo对象

准备的表有俩张,一个是学生表(t_student),一个是班级表(t_clazz)学生表可以通过cid字段到班级表中查询到对应的班级,java程序控制的外键,俩张表的数据如下:

工程目录如下:

多对一

问题的引出

假设我们要去查询一个学生的信息,这个信息包括班级信息,我们在mysql如何进行查询呢?大家很自然而然的就会想到通过多表联查即可即以下语句:

1. SELECT * FROM t_student 
2. LEFT JOIN t_clazz 
3. ON t_clazz.`cid`=t_student.`cid`
4. WHERE sid=1

查询的结果如下:

如果我们要将这条记录返回给mybatis进行的数据的封装,就需要提供一个实体类student,那么这个的时候我们需要对这个实体类的属性进行考虑,多个学生对应一个班级也就是多对一,我们把班级作为一个实体类,学生的属性中有班级这一个属性。

班级类(clazz)如下:

1. @Data
2. public class Clazz {
3. private  Long cid;
4. private  String cname;
5. }

学生类(student)如下:

1. @Data
2. public class Student {
3. private  Long sid;
4. private  String sname;
5. private  Clazz clazz;
6. }

Clazz clazz; 表示学生关联的班级对象。

级联属性映射处理

StudentMapper接口中编写接口

1. /**
2.      * 根据id查询学生信息
3.      * @param id
4.      * @return
5.      */
6.     Student selectById(@Param("id") Long id);

StudentMapper.xml中实现

1. <resultMap id="studentResultMap" type="com.study.pojo.Student">
2. <id property="sid" column="sid"/>
3. <result property="sname" column="sname"/>
4. <result property="clazz.cid" column="cid"/>
5. <result property="clazz.cname" column="cname"/>
6. </resultMap>
7. 
8. <select id="selectById" resultMap="studentResultMap">
9.         SELECT * FROM t_student
10.         LEFT JOIN t_clazz
11.         ON t_clazz.`cid`=t_student.`cid`
12.         WHERE sid=#{id}
13. </select>

级联属性映射,就是利用resultMap标签对属性和字段进行映射,内部对象的所属属性也进行映射,而SQL语句就进行表的连接进行查询。例如:clazz.cid

测试代码:

1. @Test
2. public void test01(){
3. SqlSession session = SqlSessionUtil.openSession();
4. StudentMapper mapper = session.getMapper(StudentMapper.class);
5. Student student = mapper.selectById(1L);
6.         System.out.println(student);
7.     }

association处理

association 翻译为关联的意思。它是resultMap 标签中的一个子标签。也是用来处理映射的,当一对象属性中存在另一个对象时,可以利用association 指明其对象中属性及其对应映射。

其他位置都不需要修改,只需要修改resultMap中的配置:association即可。

分步查询

分步查询处理顾名思义将查询的步骤进行分步,在我们进行查询学生信息的时候,可以分为俩步

第一步先到学生表中查到学生的sid和sname,cid

第二步拿第一步中得到的cid去班级表中查询cname

具体实施

第一处:association中select位置填写sqlId。sqlId=namespace+id。其中column属性作为这条子sql语句的条件。

1. <resultMap id="studentResultMap" type="com.study.pojo.Student">
2. <id property="sid" column="sid"/>
3. <result property="sname" column="sname"/>
4. <association property="clazz"
5. select="com.study.mapper.ClazzMapper.selectById"
6. column="cid"></association>
7. </resultMap>
8. 
9. <select id="selectById" resultMap="studentResultMap">
10.         SELECT * FROM t_student
11.         LEFT JOIN t_clazz
12.         ON t_clazz.`cid`=t_student.`cid`
13.         WHERE sid=#{id}
14. </select>

第二处:在ClazzMapper接口中添加方法

1. /**
2.      * 根据id查询班级信息
3.      * @param id
4.      */
5.     Clazz selectById(@Param("id") Long id);

第三处:在ClazzMapper.xml文件中进行配置

1. <select id="selectById" resultType="com.study.pojo.Clazz">
2.         select  * from t_clazz where cid=#{id}
3. </select>

逻辑如下:

执行结果,可以很明显看到先后有两条sql语句执行:


相关文章
|
30天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
99 6
|
1月前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
38 18
|
2月前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
73 5
|
2月前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
166 3
|
3月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
62 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
30天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
56 2
|
4月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
139 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
4月前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
83 0
mybatis使用二:springboot 整合 mybatis,创建开发环境
|
4月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
207 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
4月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
327 1