MyBatis的collection和association的使用解读

 更新时间:2023年12月27日 09:52:57   作者:秃了也弱了。  
这篇文章主要介绍了MyBatis的collection和association的使用解读

写在前面

MyBatis涉及到多表关联查询的时候,有一个非常实用的工具,可以无缝封装object、array,将结果返回指定格式的json数据。

在这里提供手把手教学,一起看collection和association如何使用。

表结构及数据准备

CREATE TABLE `test_school` (
  `id` varchar(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
CREATE TABLE `test_class` (
  `id` varchar(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `school_id` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `test_teacher` (
  `id` varchar(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `class_id` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据与关系

分别在三张表中简单的创建了几条数据,来简单的表示数据之间的关系。

我们可以看出,school与class的数据之间是一对多的关系;class与teacher之间的关系是一对一的关系。

如果只是单纯的使用sql关联查询时,会查出来三条数据,其中school的数据是重复的,因为left join嘛。

关键:MyBatis的xml

SchoolMapper.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.boot.security.server.dao.SchoolDao">
 
	<resultMap id="SchoolMap" type="com.boot.security.server.model.TestSchool">
		<id column="id" property="id" />
		<result column="name" property="name" />
		<collection property="testClasses" columnPrefix="tc_"
					resultMap="com.boot.security.server.dao.ClassDao.ClassMap"/>
	</resultMap>
 
	<select id="list" resultMap="SchoolMap">
		select ts.id,ts.name,
			tc.id AS tc_id,
			tc.name AS tc_name,
			tc.school_id AS tc_school_id,
			tt.id AS tc_tt_id,
			tt.name AS tc_tt_name,
			tt.class_id AS tc_tt_class_id
		from test_school ts
		left join test_class tc on ts.id=tc.school_id
		left join test_teacher tt on tc.id=tt.class_id
	</select>
 
</mapper>

ClassMapper.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.boot.security.server.dao.ClassDao">
 
	<resultMap id="ClassMap" type="com.boot.security.server.model.TestClass">
		<id column="id" property="id" />
		<result column="name" property="name" />
		<result column="school_id" property="schoolId" />
		<association property="testTeacher" columnPrefix="tt_"
					 resultMap="com.boot.security.server.dao.TeacherDao.TeacherMap"/>
	</resultMap>
 
</mapper>

TeacherMapper.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.boot.security.server.dao.TeacherDao">
 
	<resultMap id="TeacherMap" type="com.boot.security.server.model.TestTeacher">
		<id column="id" property="id" />
		<result column="name" property="name" />
		<result column="class_id" property="classId" />
	</resultMap>
 
</mapper>

注意!SchoolMapper.xml中的collection与ClassMapper.xml中的association!

注意!注意查询的sql起的别名,与collection和association中的columnPrefix属性需要对应

其中service、controller这里省略了,我们直接调用SchoolMapper.xml中的list方法,查看一下执行结果!

执行结果

我们可以看到,class被封装成了一个数组(因为我们在SchoolMapper.xml中用collection封装);

teacher被封装成一个对象(因为我们在ClassMapper.xml中用association封装)。

总结

MyBatis提供了非常强大的对象、数组封装方式,直接将查询出来的结果封装成对应的格式。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用ByteArrayOutputStream实现将数据写入本地文件

    使用ByteArrayOutputStream实现将数据写入本地文件

    这篇文章主要介绍了使用ByteArrayOutputStream实现将数据写入本地文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot如何自动生成API文档详解

    SpringBoot如何自动生成API文档详解

    网络程序正朝着移动设备的方向发展,前后端分离、APP,最好的交互交互方式莫过于通过API接口实现,这篇文章主要给大家介绍了关于SpringBoot如何自动生成API文档的相关资料,需要的朋友可以参考下
    2021-07-07
  • Java随机生成姓名,手机号,住址代码示例

    Java随机生成姓名,手机号,住址代码示例

    这篇文章主要介绍了Java随机生成姓名,手机号,住址代码示例,属于Java基础方面的内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot2 整合 ClickHouse数据库案例解析

    SpringBoot2 整合 ClickHouse数据库案例解析

    这篇文章主要介绍了SpringBoot2 整合 ClickHouse数据库案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java三大最常用集合List、Set、Map用法详解

    Java三大最常用集合List、Set、Map用法详解

    在Java集合框架中,List、Set、Map是最核心的三大接口,它们分别对应线性表、集合、键值对映射三种数据结构,各自有独特的设计目标和适用场景,这篇文章主要介绍了Java三大最常用集合List、Set、Map用法的相关资料,需要的朋友可以参考下
    2026-02-02
  • Spring Cloud Consul实现选举机制的代码工程

    Spring Cloud Consul实现选举机制的代码工程

    Spring Cloud Consul 是 Spring Cloud 提供的对 HashiCorp Consul 的支持,它是一种基于服务网格的工具,用于实现服务注册、发现、配置管理和健康检查,本文给大家介绍了如何用Spring Cloud Consul实现选举机制,需要的朋友可以参考下
    2024-11-11
  • 图文示例详解Lucene数据模型查询原理

    图文示例详解Lucene数据模型查询原理

    这篇文章主要为大家通过图文示例详解Lucene数据模型查询原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • java.lang.Runtime.exec的左膀右臂:流输入和流读取详解

    java.lang.Runtime.exec的左膀右臂:流输入和流读取详解

    这篇文章主要介绍了java.lang.Runtime.exec的左膀右臂:流输入和流读取详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot如何配置Controller实现Web请求处理

    SpringBoot如何配置Controller实现Web请求处理

    这篇文章主要介绍了SpringBoot如何配置Controller实现Web请求处理,文中通过图解示例介绍的很详细,具有有一定的参考价值,需要的小伙伴可以参考一下
    2023-05-05
  • Java中常见的日期操作(取值、转换、加减、比较)

    Java中常见的日期操作(取值、转换、加减、比较)

    本文给大家介绍java中常见的日期操作,日期取值、日期转换、日期加减、日期比较,对java日期操作相关知识感兴趣的朋友一起学习吧
    2015-12-12

最新评论