MyBatis的collection和association的使用详解,我们都懂啦

本文详细介绍了如何使用MyBatis进行多表关联查询,通过实例展示了SchoolMapper、ClassMapper和TeacherMapper的配置,利用collection和association实现对象和数组的封装,将查询结果转换为JSON格式。通过这种方式,可以方便地处理一对多和一对一的关系,简化开发工作。

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

目录

写在前面

表结构及数据准备

数据与关系

关键:MyBatis的xml

SchoolMapper.xml

ClassMapper.xml

TeacherMapper.xml

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

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

执行结果

总结


写在前面

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提供了非常强大的对象、数组封装方式,直接将查询出来的结果封装成对应的格式。

极大地方便了日常开发!

MyBatis中,associationcollection是resultMap属性中用于定义关联对象集合对象映射规则的元素。 1. association:用于定义关联对象的映射规则。它可以在一个resultMap中嵌套另一个resultMap,以实现对象之间的关联映射。常见的应用场景是一对一的关联关系。 association元素可以包含以下属性: - property:指定关联对象在Java对象中的属性名。 - column:指定关联字段在数据库中的列名。 - resultMap:指定关联对象的resultMap,用于定义关联对象的映射规则。 示例: ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <association property="role" resultMap="roleResultMap"/> </resultMap> ``` 2. collection:用于定义集合对象的映射规则。它可以将查询结果中的多行数据映射为一个集合对象,常见的应用场景是一对多的关联关系。 collection元素可以包含以下属性: - property:指定集合对象在Java对象中的属性名。 - ofType:指定集合元素的类型。 - column:指定关联字段在数据库中的列名。 - resultMap:指定集合元素的resultMap,用于定义集合元素的映射规则。 示例: ```xml <resultMap id="orderResultMap" type="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <collection property="items" ofType="OrderItem" resultMap="orderItemResultMap"/> </resultMap> ``` 通过使用associationcollection元素,我们可以定义复杂的对象关系映射,使查询结果能够直接转换为Java对象及其关联对象或集合对象。这样可以方便地进行对象间的关联查询数据封装。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃了也弱了。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值