mybatis一对多collection select,mybatis嵌套子查询

  mybatis一对多collection select,mybatis嵌套子查询

  在开发中,可能会遇到一对多的关系,这个时候,一条结构化查询语言语句就难以胜任这个任务了。只能先执行一条sql,然后根据返回的结果,再做一次结构化查询语言关联查询,这个时候,使用框架的募捐就可以实现。

  如果第一次查询返回的是一个目录集合,那么,后续的查询就是一个为循环。所以不使用募捐的做法,在爪哇岛语言中,就要分两次查询。一般而言,我们的列表查询都是分页查询,所以集合数据不会太大,第二次为循环查询效率还好。

  下面介绍框架使用募捐嵌套查询解决这个问题。这里为了简单,以员工与部门的关系来做这个实验,其实员工与部门的关系还应该使用一个中间表来关联,这里只用两张表。

  表结构与数据如下所示:

  数据:

  这里采用专家构建springboot mybatis-plus mysql工程。

  依赖关系groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId版本3。2 .0/版本/依赖项依赖关系groupId MySQL/groupId artifactId MySQL-连接器-Java/artifactId/依赖关系依赖关系groupIdorg.projectlombok/groupId artifactId lombok/artifactId/依赖项定义的实体:

  员工信息:

  包com。XXX。弹簧靴。我的巴蒂斯。域;导入Java。util。列表;导入com。窦米宝。mybatisplus。注释。tablename进口龙目岛。数据;@Data@TableName(xx_emp )公共类员工{私有整数id私有字符串名称;私人年龄;私人列表部门部门;}部门信息

  包com。XXX。弹簧靴。我的巴蒂斯。域;导入com。窦米宝。mybatisplus。注释。tablename进口龙目岛。数据;@Data@TableName(xx_dept )公共类部门{私有整数id;私有字符串名称;私有整数userId}映射器接口

  包com。XXX。弹簧靴。我的巴蒂斯。映射器;导入org。阿帕奇。伊巴提斯。注释。映射器;导入com。窦米宝。mybatisplus。核心。制图师。碱基映射器;导入com。XXX。弹簧靴。我的巴蒂斯。域。部门;导入com。XXX。弹簧靴。我的巴蒂斯。域。员工;@ mapper公共接口EMP mapper扩展basemapperememployee {按名称查询员工(字符串名称);部门queryByUserId(整数userId);}EmpMapper.xml配置文件

  ?可扩展标记语言版本=1.0 编码=UTF八号?DOCTYPE Mapper PUBLIC -//mybatis。org//DTD Mapper 3.0//EN http://my batis。组织/部门

  d/mybatis-3-mapper.dtd"><mapper namespace="com.xxx.springboot.mybatis.mapper.EmpMapper"> <resultMap id="empMap" type="com.xxx.springboot.mybatis.domain.Employee" > <id column="id" property="id" /> <result column="name" property="name" /> <result column="age" property="age" /> <collection property="depts" javaType="java.util.ArrayList" ofType="com.xxx.springboot.mybatis.domain.Department" select="com.xxx.springboot.mybatis.mapper.EmpMapper.queryByUserId" column="{userId=id}"></collection> </resultMap> <resultMap id="deptMap" type="com.xxx.springboot.mybatis.domain.Department"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="user_id" property="userId"/> </resultMap> <select id="queryByName" resultMap="empMap"> SELECT * FROM xx_emp WHERE name = #{name} </select> <select id="queryByUserId" resultMap="deptMap"> SELECT * FROM xx_dept WHERE user_id = #{userId} </select></mapper>测试类:

  

package com.xxx.springboot; import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner; import com.baomidou.mybatisplus.core.toolkit.Wrappers;import com.xxx.springboot.mybatis.domain.Employee;import com.xxx.springboot.mybatis.mapper.EmpMapper;@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)public class MyBatisTest {@Autowiredprivate EmpMapper empMapper; @Testpublic void testEmpQuery() {Employee emp = empMapper.queryByName("aa");System.out.println(emp);}}

运行单元测试,打印信息如下:

 

  

 

  这个程序,在第一次根据名称查询员工信息之后,返回id=1,name=aa,age=18,接着,根据id=1 查询了部门表,其实这里的id=1,作为参数传入部门表中,就成了user_id对应的参数,然后就查询出了两个部门记录id=1,id=3,最后打印的员工信息里面,depts就是一个集合。

  使用这个嵌套查询,需要注意的是collection有如下属性:

  property 实体中对应的属性,这里是depts。 javaType 实体属性的类型,这里是一个集合,所以使用java.util.ArrayList表示。 ofType 集合范型中的类型,这里是部门信息,对应java类Department select 嵌套子查询的ID column 这里最关键,也比较难理解,默认一个参数,可以直接写column = "id",最后根据参数类型匹配。这里其实是传入子查询中的参数,也就是子查询的关联属性user_id对应的参数值,在collection这里就是主sql中查询出来的列值,如果这里id有了别名,比如emp_id,这里就应该写column = "emp_id"。还有一种写法,通过大括号来表示,这种写法可以传入多个参数(多个参数用逗号隔开)。对于本示例而言,正确的写法就是column={userId=id},userId对应 queryByUserId查询语句中 SELECT * FROM xx_dept WHERE user_id = #{userId} 参数userId。id就是主sql查询出来的列id值,就是xx_emp对应的id列值。

  我个人在使用collection的时候,大概明白这种嵌套查询的作用,但是就是不明白,怎么传递参数,后来看过一些例子,原来主要点就在column属性这里。

  到此这篇关于mybatis使用collection嵌套查询的实现的文章就介绍到这了,更多相关mybatis collection嵌套查询内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: