springboot mybatis 多对多查询

时间: 2023-11-18 18:52:00 浏览: 38
对于 Spring Boot 和 MyBatis 的多对多查询,可以通过中间表来实现。首先,在中间表中定义两个外键,分别指向两个表的主键,并将这两个外键设为联合主键。然后再分别定义两个对应实体类,使用 @ManyToMany 注解来映射关系。最后,在查询时使用 MyBatis 的动态 SQL,通过多次嵌套查询语句来实现多对多的查询。 具体步骤如下: 1. 在中间表中定义两个外键,并将这两个外键设为联合主键: ``` CREATE TABLE `table_A_table_B` ( `table_A_id` int(11) NOT NULL, `table_B_id` int(11) NOT NULL, PRIMARY KEY (`table_A_id`,`table_B_id`), KEY `fk_table_A_table_B_table_A_idx` (`table_A_id`), KEY `fk_table_A_table_B_table_B_idx` (`table_B_id`), CONSTRAINT `fk_table_A_table_B_table_A` FOREIGN KEY (`table_A_id`) REFERENCES `table_A` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_table_A_table_B_table_B` FOREIGN KEY (`table_B_id`) REFERENCES `table_B` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; ``` 2. 分别定义两个对应实体类,使用 @ManyToMany 注解来映射关系: ``` public class TableA { private Integer id; private String name; private List<TableB> tableBs; // getter and setter } public class TableB { private Integer id; private String name; private List<TableA> tableAs; // getter and setter } ``` ``` <!-- TableA Mapper --> <mapper namespace="com.example.mapper.TableAMapper"> <resultMap id="TableAResultMap" type="com.example.entity.TableA"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="tableBs" ofType="com.example.entity.TableB" resultMap="TableBResultMap"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> SELECT tb.* FROM table_A_table_B tatb INNER JOIN table_B tb ON tatb.table_B_id = tb.id WHERE tatb.table_A_id = #{id} </collection> </resultMap> <select id="findById" resultMap="TableAResultMap"> SELECT * FROM table_A WHERE id = #{id} </select> </mapper> ``` ``` <!-- TableB Mapper --> <mapper namespace="com.example.mapper.TableBMapper"> <resultMap id="TableBResultMap" type="com.example.entity.TableB"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="tableAs" ofType="com.example.entity.TableA" resultMap="TableAResultMap"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> SELECT ta.* FROM table_A_table_B tatb INNER JOIN table_A ta ON tatb.table_A_id = ta.id WHERE tatb.table_B_id = #{id} </collection> </resultMap> <select id="findById" resultMap="TableBResultMap"> SELECT * FROM table_B WHERE id = #{id} </select> </mapper> ``` 3. 使用 MyBatis 的动态 SQL,通过多次嵌套查询语句来实现多对多的查询: ``` public interface TableAMapper { @Select("SELECT * FROM table_A WHERE id IN (SELECT table_A_id FROM table_A_table_B WHERE table_B_id = #{tableBId})") List<TableA> findByTableBId(Integer tableBId); } public interface TableBMapper { @Select("SELECT * FROM table_B WHERE id IN (SELECT table_B_id FROM table_A_table_B WHERE table_A_id = #{tableAId})") List<TableB> findByTableAId(Integer tableAId); } ```

相关推荐

最新推荐

recommend-type

Mybatis基于注解实现多表查询功能

主要介绍了Mybatis基于注解实现多表查询功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询.pdf

SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。
recommend-type

springboot+mybatis配置控制台打印sql日志的方法

主要介绍了springboot+mybatis配置控制台打印sql日志的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

SpringBoot整合MyBatis实现乐观锁和悲观锁的示例

主要介绍了SpringBoot整合MyBatis实现乐观锁和悲观锁的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Springboot如何使用mybatis实现拦截SQL分页

主要介绍了Springboot使用mybatis实现拦截SQL分页,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解答下列问题:S—>S;T|T;T—>a 构造任意项目集规范族,构造LR(0)分析表,并分析a;a

对于这个文法,我们可以构造以下项目集规范族: I0: S -> .S S -> .T T -> .a I1: S -> S. [$ T -> T. [$ I2: S -> T. I3: S -> S.;S S -> S.;T T -> T.;a 其中,点(.)表示已经被扫描过的符号,;$表示输入串的结束符号。 根据项目集规范族,我们可以构造出LR(0)分析表: 状态 | a | $ ---- | - | - I0 | s3| I1 | |acc I2 | | 其中s3表示移进到状态3,acc表示接受。在分析字符串a;a时,我们可以按照以下步骤进行
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。