首页 > 其他分享 >技术框架中对高级查询一对多查询的学习

技术框架中对高级查询一对多查询的学习

时间:2024-12-09 21:33:35浏览次数:5  
标签:name 框架 where 高级 查询 game tb id

高级查询之一对多查询

查询条件

根据游戏名称,查询游戏账号信息

我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下:

		/**
     * 根据游戏名查询游戏账号
     * @param name 游戏名
     * @return 游戏实体类
     */
    public GameEntity selectGameByName(String name);

接下来,我分别演示关联查询和子查询方式实现接口方法的映射。

关联查询方式

现在我们暂时先抛开 MyBatis 框架,直接从数据库出发写一写关联查询的 SQL 语句,如下:

select g.*,a.* from tb_game as g join tb_account as a on g.id=a.game_id where g.name ='英雄联盟'

我们在数据库中执行这条 SQL 语句,结果如下:

现在,我们回到 MyBatis 框架,看一下在 XML 映射文件中,如何实现关联查询映射。

首先,我们需要建立 GameEntity 实体类与 AccountEntity 实体类之间的关联关系,如下:

public class GameEntity {
    private int id;
    private String name;
    private String type;
    private String operator;
    private List<AccountEntity> accounts; //关联引用游戏账号集合
}

这样,通过游戏名查询的账号信息就可以映射到 accounts 属性中。注意 accounts 属性的 get 和 set 方法要记得添加上去,还有 toString 方法要重写一下,添加 accounts 属性的打印信息。

你可能有疑惑,这里为何要使用 List 集合呢?原因是一款游戏对应的账号信息可能有多个,而 MyBatis 可以通过使用 resultMap 的 collection 标记将关联查询的多条记录映射到一个 List 集合属性中。

现在,我们来编写映射文件中 SQL 语句映射,如下:

<?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="mapper.GameMapper">
    <resultMap id="gameResultMap" type="entity.GameEntity">
        <id property="id" column="id" />
        <result property="name" column="name" />
        <result property="type" column="type" />
        <result property="operator" column="operator" />
      
       <!-- collection:一对多映射,关联当前分类下产品信息 
					  property:映射集合结果
					  ofType:结果集类型 -->
        <collection property="accounts" ofType="entity.AccountEntity">
            <id property="id" column="aid" />
            <result property="userName" column="user_name" />
            <result property="password" column="password" />
        </collection>
    </resultMap>
    <select id="selectGameByName" resultMap="gameResultMap">
        select g.*,a.id as aid,a.user_name,a.password from tb_game as g join tb_account as a on g.id=a.game_id where g.name =#{name}
    </select>
</mapper>

以上和一对一关联查询相比,association 标记改为 collection 标记,表示是一对多映射;javaType 属性改为ofType 属性,表示集合里的元素类型。除此以外,和一对一关联查询差不多。

最后,我们在 MyBatisTest 中添加一个单元测试方法,如下:

	@Test
    public void selectGameByNameTest() {
        GameEntity gameEntity = gameMapper.selectGameByName("英雄联盟");
        System.out.println(gameEntity);

        Assert.assertNotNull(gameEntity);
    }

执行单元测试方法,结果如下:

2020-07-15 18:34:05,260 [main] [mapper.GameMapper.selectGameByName]-[DEBUG] ==>  Preparing: select g.*,a.* from tb_game as g join tb_account as a on g.id=a.game_id where g.name =? 
2020-07-15 18:34:05,307 [main] [mapper.GameMapper.selectGameByName]-[DEBUG] ==> Parameters: 英雄联盟(String)
2020-07-15 18:34:05,354 [main] [mapper.GameMapper.selectGameByName]-[DEBUG] <==      Total: 2
GameEntity{id=1, name='英雄联盟', type='MOBA', operator='腾讯游戏', accounts=[AccountEntity{id=1, userName='潇洒哥', password='12345'}, AccountEntity{id=4, userName='进击巨人', password='11111'}]}

子查询方式

首先,我们暂时先抛开 MyBatis 框架,直接从数据库出发写一写子查询的 SQL 语句,如下:

select * from tb_account where game_id = (select id from tb_game where name ='英雄联盟')

接着,这里我们直接来编写映射文件中 SQL 语句映射,如下:

<?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="mapper.GameMapper">
    <resultMap id="gameResultMap" type="entity.GameEntity">
        <id property="id" column="id" />
        <result property="name" column="name" />
        <result property="type" column="type" />
        <result property="operator" column="operator" />
      
     		<!-- collection:用于映射关联查询多个对象信息
		         property:将关联查询的账号信息映射到属性 accounts 上
 						 column:传递子查询参数
						 select:子查询id
				-->
        <collection property="accounts" ofType="entity.AccountEntity"
            column="id" select="selectAccountById" />
    </resultMap>
  
    <select id="selectGameByName" resultMap="gameResultMap">
        select * from tb_game where name =#{name}
    </select>
    <select id="selectAccountById" resultType="entity.AccountEntity">
        select * from tb_account where game_id=#{gameId}
    </select>
</mapper>

执行测试,结果如下:

2020-07-15 21:25:11,086 [main] [mapper.GameMapper.selectGameByName]-[DEBUG] ==>  Preparing: select * from tb_game where name =? 
2020-07-15 21:25:11,164 [main] [mapper.GameMapper.selectGameByName]-[DEBUG] ==> Parameters: 英雄联盟(String)
2020-07-15 21:25:11,211 [main] [mapper.GameMapper.selectAccountById]-[DEBUG] ====>  Preparing: select * from tb_account where game_id=? 
2020-07-15 21:25:11,211 [main] [mapper.GameMapper.selectAccountById]-[DEBUG] ====> Parameters: 1(Integer)
2020-07-15 21:25:11,211 [main] [mapper.GameMapper.selectAccountById]-[DEBUG] <====      Total: 2
2020-07-15 21:25:11,211 [main] [mapper.GameMapper.selectGameByName]-[DEBUG] <==      Total: 1
GameEntity{id=1, name='英雄联盟', type='MOBA', operator='腾讯游戏', accounts=[AccountEntity{id=1, userName='潇洒哥', password='12345'}, AccountEntity{id=4, userName='进击巨人', password='11111'}]}

标签:name,框架,where,高级,查询,game,tb,id
From: https://www.cnblogs.com/BingBing-8888/p/18596070

相关文章

  • Torch-TensorRT针对 NVIDIA GPU 的 PyTorch 推理代码的框架内编译In-framework compil
    Torch-TensorRT针对NVIDIAGPU的PyTorch推理代码的框架内编译Torch-TensorRT是PyTorch的推理编译器,通过NVIDIA的TensorRT深度学习优化器和运行时针对NVIDIAGPU。它通过接口支持即时(JIT)编译工作流程torch.compile,也支持提前(AOT)工作流程。Torch-TensorRT......
  • 快速掌握Quartz.Net计划任务调度框架,轻松实现定时任务
    前言Quartz.Net是一个开源的作业调度框架,可以用于管理计划任务和定期执行。Quartz.Net提供了丰富的作业计划选项,例如精确或模糊时间表达式、日期和时间限制等。Quartz.Net采用分布式架构,允许在多个计算机上运行任务。Quartz.Net架构设计Quartz.Net的架构设计采用了经典......
  • 【redis】关于查询和分析redis中的bigkeys问题
    一、场景   今年的实际业务中,出现了一次redisbigkeys导致的生产事故,导致业务1个小时收不到指令。 二、关于bigkeys查询方法1、使用redis-cli加--bigkeys参数$redis-cli-h192.168.3.74-p6379--bigkeys  2、使用redis-cli中的scan和memoryusagehttps://op......
  • flask框架大学生校园兼职平台毕设源码+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于大学生校园兼职平台的研究,现有研究多集中在大学生兼职的一般情况分析,如兼职的种类、兼职的动机等方面。专门针对大学生校园兼职平......
  • flask框架餐饮结算系统毕设源码+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于餐饮结算系统的研究,现有研究主要以传统结算方式的优化为主,专门针对智能化餐饮结算系统整体架构与功能优化的研究较少。在餐饮行业......
  • 高级数据库模式设计与性能优化
    数据库模式设计不仅仅是创建表和字段那么简单,还需要考虑数据的一致性、性能优化、安全性和可扩展性等多个方面。本文将深入探讨数据库模式设计的高级技巧,并提供一个实际的例子来展示如何在项目中应用这些技巧。1.数据库模式设计的高级技巧1.1多对多关系的处理多对多关......
  • Apache Doris高级数据建模与复杂查询优化
    ApacheDoris(原名Palo)是一款高性能的分布式SQL数据库,专注于实时分析。它结合了MPP架构和向量化执行引擎,能够提供快速的数据查询和分析能力。在进行高级数据建模与复杂查询优化时,以下几点是关键:高级数据建模1.数据模型选择宽表设计:尽量减少JOIN操作,将关联的数据存储在同......
  • 接口超时日志排查分析-BeanUtils对象复制6秒及类型不一致复制异常,复制null属性被覆盖
    接口超时日志排查分析-BeanUtils对象复制6秒及类型不一致复制异常,复制null属性被覆盖解决,常见Bean拷贝框架的性能对比1.接口超时日志排查分析-BeanUtils对象复制6秒1.查询日志命令,分析接口的请求及响应的时长catproJectDock.log|grep-E"请求开始时间|请求正常消耗时间">>......
  • 基于SSM框架的校园订餐小程序设计与实现
    内容概要:该文章介绍了使用SSM(Spring+SpringMVC+MyBatis)框架及Java开发语言和MySQL数据库,设计并实现了一款名为“校园订餐”的小程序。文中从系统需求出发,阐述了系统背景意义与国内外研究现状发展趋势,明确了需求并分析了系统可行性。随后详细讲解了系统的功能模块、数据库......
  • 基于SSM的考研信息查询系统【附源码+文档】
    ......