广告
返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis使用collection嵌套查询的实现
  • 558
分享到

mybatis使用collection嵌套查询的实现

2024-04-02 19:04:59 558人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

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

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

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

表结构与数据如下所示:

数据:

这里采用Maven构建SpringBoot+mybatis-plus+Mysql工程。

<dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.2.0</version>
    </dependency>
    
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>

定义的实体:

员工信息:

package com.xxx.springboot.mybatis.domain;
 
import java.util.List;
 
import com.baomidou.mybatisplus.annotation.TableName;
 
import lombok.Data;
 
@Data
@TableName("xx_emp")
public class Employee {
	private Integer id ;
	private String name ;
	private int age ;
	
	private List<Department> depts ;
}

部门信息 

package com.xxx.springboot.mybatis.domain;
 
import com.baomidou.mybatisplus.annotation.TableName;
 
import lombok.Data;
 
@Data
@TableName("xx_dept")
public class Department {
	
	private Integer id ;
	
	private String name ;
	
	private Integer userId ;
 
}

Mapper接口

package com.xxx.springboot.mybatis.mapper;
 
import org.apache.ibatis.annotations.Mapper;
 
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xxx.springboot.mybatis.domain.Department;
import com.xxx.springboot.mybatis.domain.Employee;
@Mapper
public interface EmpMapper extends BaseMapper<Employee>{
	Employee queryByName(String name);
	Department queryByUserId(Integer userId);
}

EmpMapper.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.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 {
	
	@Autowired
	private EmpMapper empMapper;
	
 
	@Test
	public 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嵌套查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: mybatis使用collection嵌套查询的实现

本文链接: https://www.lsjlt.com/news/148279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis使用collection嵌套查询的实现
    在开发中,可能会遇到一对多的关系,这个时候,一条sql语句就难以胜任这个任务了。只能先执行一条sql,然后根据返回的结果,再做一次sql关联查询,这个时候,使用mybatis的col...
    99+
    2022-11-13
  • Mybatis的collection三层嵌套查询怎么写
    这篇“Mybatis的collection三层嵌套查询怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Mybatis的c...
    99+
    2023-07-05
  • mybatis 实现多层级collection嵌套
    目录mybatis多层级collection嵌套json结构第一步查询第二步查询第三步查询(第三层查询)最后附实体截图,其实看json就可以了方式二(推荐)mybatis多层(三层)...
    99+
    2022-11-13
  • Mybatis的collection三层嵌套查询方式(验证通过)
    目录Mybatis collection三层嵌套查询一般情况下,我们都是两层的嵌套找到一个方案实体类的映射关系SQL映射关系如下解析如下总结Mybatis collection三层嵌...
    99+
    2023-03-15
    Mybatis collection collection三层嵌套查询 collection嵌套查询
  • MyBatis的嵌套查询解析
    Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-many、many-to-one、one-to-one。而是只有两种association(一)、collection(多),表现很简洁。下面通过一个实例,来展...
    99+
    2023-05-31
    mybatis 嵌套 查询
  • mybatis中嵌套查询的使用解读
    目录mybatis嵌套查询的使用传递多个参数总结mybatis嵌套查询的使用 在使用mybatis时,当我们遇到表与表之之间存在关联的时候,就可以使用嵌套查询 比如说 当一个对象包含...
    99+
    2023-03-15
    mybatis嵌套查询 嵌套查询使用 mybatis查询
  • mybatis中的嵌套查询如何使用
    今天小编给大家分享一下mybatis中的嵌套查询如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。mybatis嵌套查询...
    99+
    2023-07-05
  • mybatis一对多嵌套查询怎么实现
    本文小编为大家详细介绍“mybatis一对多嵌套查询怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis一对多嵌套查询怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。mybatis一对多嵌...
    99+
    2023-07-05
  • mybatis嵌套查询和嵌套结果的区别是什么
    本篇内容介绍了“mybatis嵌套查询和嵌套结果的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mybatis嵌套查询和嵌套结果有...
    99+
    2023-07-05
  • Fluent Mybatis零xml配置实现复杂嵌套查询
    目录嵌套查询in (select 子查询)exists (select子查询)嵌套查询 使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在d...
    99+
    2022-11-12
  • MySQL嵌套查询实现子查询的方法
    目录一个查询语句嵌套在另一个查询语句内部的查询1.带ANY(SOME)关键字的子查询2.带ALL关键字的子查询3.带EXISTS关键字的子查询4.带IN关键字的子查询5.带比较运算符...
    99+
    2022-11-13
  • mybatis collection 多条件查询的实现方法
    mybatis collection 多条件查询的实现方法 前言: 业务需要通过mybatis 查询返回嵌套集合,嫌多次查询太麻烦,用自带的高级查询解决问题,下边是代码,已测试通过。 说下自己的理解,就是一...
    99+
    2022-10-18
  • mybatis 集合嵌套查询和集合嵌套结果的区别说明
    目录集合嵌套查询和集合嵌套结果的区别1.创建2张表,建立主外键关系2.建立实体类3.修改配置文件4.建立映射文件5.创建测试类MyBatis 嵌套查询解析对应的JavaBean对应的...
    99+
    2022-11-12
  • MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)
    目录MyBatis一对多的xml配置嵌套查询嵌套结果一对多关联查询xml配置写法  情景概述创建表对应 java Pojo查询 客户表client 获取客户名下的附件信息查...
    99+
    2022-11-13
  • SQL中怎么实现嵌套查询
    SQL中怎么实现嵌套查询,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一个优秀的系统,会集成优秀的程序和优秀的数据库设计. 要做到这点得有足够...
    99+
    2022-10-18
  • LINQ中怎么实现嵌套查询
    这篇文章将为大家详细讲解有关LINQ中怎么实现嵌套查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。LINQ嵌套查询应用实例:如果我们需要取出市场部的所有员工,在以往的O/R Mapping...
    99+
    2023-06-17
  • Mybatis关联查询结果集对象嵌套的具体使用
    在查询时经常出现一对多”的关系,所有会出现嵌套对象的情况,Mybatis在resultMap提供了collection标签,本文适合有一定Mybatis基础的读者查阅 数...
    99+
    2022-11-13
  • SQL 嵌套查询的具体使用
    目录插入数据  select子查询(外语句先执行,内语句后执行)总结嵌套查询又称子查询,有select子查询,where子查询,from子查询,exists子查询。 插入数据&nb...
    99+
    2023-01-28
    SQL嵌套查询
  • SQL嵌套查询的具体使用
    目录插入数据  select子查询(外语句先执行,内语句后执行)总结嵌套查询又称子查询,有select子查询,where子查询,from子查询...
    99+
    2023-01-28
    SQL 嵌套查询
  • MyBatis实现两种查询树形数据的方法详解(嵌套结果集和递归查询)
    目录方法一:使用嵌套结果集实现1,准备工作2,实现代码方法二:使用递归查询实现    树形结构数据在开发中十分常见,比如:菜单数、组织树, 利用&nbs...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作