mybatis使用collection嵌套查询

这篇具有很好参考价值的文章主要介绍了mybatis使用collection嵌套查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

    表结构与数据如下所示:

mybatis使用collection嵌套查询

    数据:

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);
	}
}

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

mybatis使用collection嵌套查询 

    这个程序,在第一次根据名称查询员工信息之后,返回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属性这里。文章来源地址https://www.toymoban.com/news/detail-410978.html

到了这里,关于mybatis使用collection嵌套查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch 基本使用(二)简单查询 & 嵌套查询

    按id查询单条记录 查询所有数据 默认只查询10条记录 设置分页条件 设置排序 两种设置方式 注意:_id 为字符串,其排序方式为按位比较,并非数值大小 filter 过滤 在 bool 查询内,可以使用 filter 对数据进行过滤。 单从最终数据来看,filter 也是用于过滤数据,用于条件查询。

    2024年02月03日
    浏览(35)
  • MyBatis多表查询和注解开发

    一对一查询的模型 用户表和订单表的关系为, 一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户 一对一查询的语句 对应的sql语句: 查询的结果如下: 创建Order和User实体 创建OrderMapper接口 配置OrderMappe

    2024年02月04日
    浏览(44)
  • MyBatis注解开发---实现自定义映射关系和关联查询

    目录 相关导读 一、使用注解实现自定义映射关系 1. 编写注解方法 2. 编写测试方法

    2023年04月09日
    浏览(41)
  • 【附证明】用ArcGIS中Band Collection Statistics做相关性分析可能存在错误

    ArcGIS相关性分析 Spatial Analyst Tools——Multivariate(多元分析)——Band Collection Statistics(波段集统计)。 添加图层,勾选Compute covariance and correlation matrices以输出相关第分析结果,结果保存成txt。 使用的是皮尔逊相关系数(Pearson Correlation Coefficient)。 Spatial Analyst Tools——Mult

    2023年04月08日
    浏览(33)
  • Java企业级开发学习笔记(2.1)MyBatis实现简单查询

    零、创建数据库与表 在Navicat里创建MySQL数据库testdb 创建用户表 - t_user CREATE TABLE t_user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) DEFAULT NULL, age int(11) DEFAULT NULL, address varchar(255) DEFAULT NULL, PRIMARY KEY ( id ) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 执行SQL语句来创建用户表 INSERT IN

    2024年02月09日
    浏览(87)
  • 使用MyBatis实现简单查询

    执行SQL语句来创建用户表 查看用户表结构 执行SQL语句插入记录 查看用户表记录 采用Maven构建工具,不用你手动去下载jar包,所有jar包仓库统一管理,只要配置一下pom文件,run-install…依赖的包就会下载下来,省去你管理依赖的时间。(pom: Project Object Model 项目对象模型) 1

    2023年04月22日
    浏览(29)
  • mybatis使用多参数查询

    repository接口写法: Mapper层配置文件写法: 注意:resultmap是结果集,select为查询语句。其中,#{…}中的名字要和@Param注解中的参数名对应

    2024年02月09日
    浏览(53)
  • Mybatis中 collection 和 association 标签 的区别

    collection 和 association 是 MyBatis 中用于定义映射关系的标签,它们的区别如下: 目标对象类型: collection 用于表示集合属性,即一个属性对应多个关联对象。 association 用于表示关联属性,即一个属性对应一个关联对象。 关联关系处理: collection 用于处理一对多或多对多的关联

    2024年02月09日
    浏览(45)
  • MyBatis(多表查询,动态SQL的使用)

    目录 多表查询  查询文章详情 查询一个用户底下的所有文章 动态SQL的使用 if 标签 trim 标签  where 标签 set 标签 foreach 标签 现在有俩张表,一张是 文章表 ,一张是 用户表 .如下: 我们现在想查询得到一张表,表里面的内容和文章表大多一致,只是要 在文章表的基础上添加用户表中

    2024年02月10日
    浏览(45)
  • 【MySQL】嵌套查询—数据之旅:解析层层嵌套的迷思

    🎊专栏【MySQL】 🌺每日一句:宝剑锋从磨砺出,梅花香自苦寒来 ⭐欢迎并且感谢大家指出我的问题 文章目录 嵌套查询 (1)不相关子查询(带有IN谓词的子查询) 🍔定义 🍔使用说明 🍔特点 🍔实际操作 🍔三层嵌套查询 (2)相关子查询(带有EXISTS谓词的子查询) 🍔定义 🍔使用说明

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包