MyBatis 多表查询应该这么玩,MyBatis-Flex v1.3.3 发布
Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。
总而言之,Mybatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。
MyBatis-Flex  v1.3.3 主要是增强了多表查询的功能,假设有 tb_account 用户表和 tb_article 文章表,他们的字段分别如下:
CREATE TABLE IF NOT EXISTS `tb_account`
(
    `id`        INTEGER PRIMARY KEY auto_increment,
    `user_name` VARCHAR(100),
    `age`       Integer,
    `birthday`  DATETIME
);
CREATE TABLE IF NOT EXISTS `tb_article`
(
    `id`         INTEGER PRIMARY KEY auto_increment,
    `account_id` Integer,
    `title`      VARCHAR(100),
    `content`    text
);
MyBatis-Flex 提供了 3 中方式,可以进行关联查询:
方式 1
1、定义 ArticleDTO 类,ArticleDTO 里定义 tb_account 表的字段映射。
public class ArticleDTO {
    private Long id;
    private Long accountId;
    private String title;
    private String content;
    
    //以下用户相关字段
    private String userName;
    private int age;
    private Date birthday;
}
然后直接通过 QueryWrapper 查询,代码如下:
QueryWrapper query = QueryWrapper.create()
        .select(ARTICLE.ALL_COLUMNS)
        .select(ACCOUNT.USER_NAME,ACCOUNT.AGE,ACCOUNT.BIRTHDAY)
        .from(ARTICLE)
        .leftJoin(ACCOUNT).on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID));
List<ArticleDTO> results = mapper.selectListByQueryAs(query, ArticleDTO.class);
System.out.println(results);
方式 2
假设 ArticleDTO 定义的属性和 数据库字段不一致时,例如:
public class ArticleDTO {
  private Long id;
  private Long accountId;
  private String title;
  private String content;
  //以下用户字段 和 用户表定义的列不一致,表定义的列为 user_name
  private String authorName;
  private int authorAge;
  private Date birthday;
}
那么, QueryWrapper 需要添加 as,修改如下:
QueryWrapper query = QueryWrapper.create()
    .select(ARTICLE.ALL_COLUMNS)
    .select(ACCOUNT.USER_NAME.as(ArticleDTO::getAuthorName)
            ,ACCOUNT.AGE.as(ArticleDTO::getAuthorAge)
            ,ACCOUNT.BIRTHDAY
    )
    .from(ARTICLE)
    .leftJoin(ACCOUNT).on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID));
List<ArticleDTO> results = mapper.selectListByQueryAs(query, ArticleDTO.class);
System.out.println(results);
方式 3 
1、在 ArticleDTO 直接定义 Account 实体类属性。 例如:
public class ArticleDTO {
    private Long id;
    private Long accountId;
    private String title;
    private String content;
    
    //直接定义 Account 对象
    private Account account;
}
查询方式和方式1一样,使用 QueryWrapper 构建 left join 查询,查询结果通过 ArticleDTO 类型接收。
QueryWrapper query = QueryWrapper.create()
        .select(ARTICLE.ALL_COLUMNS)
        .select(ACCOUNT.USER_NAME,ACCOUNT.AGE,ACCOUNT.BIRTHDAY)
        .from(ARTICLE)
        .leftJoin(ACCOUNT).on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID));
List<ArticleDTO> results = mapper.selectListByQueryAs(query, ArticleDTO.class);
System.out.println(results);
一对多查询
在以上的例子中,一个作者可能有多篇文档,假设 Account 的属性定义如下:
public class Article {
    private Long id;
    private String userName;
    private int age;
    //一个作者有多篇文章
    private List<Article> articles;
}
那么,查询代码如下:
QueryWrapper query = QueryWrapper.create()
        .select().form(ACCOUNT);
List<Account> accounts = mapper.selectListByQuery(query
    , fieldQueryBuilder -> fieldQueryBuilder
        .field(Account::getArticles) // 或者 .field("articles")
        .queryWrapper(account -> QueryWrapper.create()
            .select().from(ARTICLE)
            .where(ARTICLE.ACCOUNT_ID.eq(account.getId())
            )
        )
    );
知识点
MyBatis-Flex 的关联子查询,和 JPA 等其他第三方框架有很大的差异,比如 JPA 是通过配置来构建查询 SQL,其构建生成的 SQL 对于用户来说是不透明的。 因此,用户几乎无法对 JPA 的注解生成 SQL 优化。
而 MyBatis-Flex 关联子查询的 SQL 完全是由用户构建的,因此会更加灵活,更加有利于我们进行 SQL 优化。在子查询中,有很多的场景,JPA 一对一、 一对多等等不同的场景给出了不同的注解、以及参数,导致用户的学习成本非常高。另外,在很多业务场景下, 比如多租户、逻辑删除、等等 MyBatis-Flex 都是内部自动处理,而 JPA 通过注解的实现则是非常麻烦。
对 MyBatis-Flex 来说,学习成本是非常低的,在构建子查询时,只需要明白为哪个字段、通过什么样的 SQL 查询就可以了,以下是示例:
因此,在 MyBatis-Flex 的设计中,无论是一对多、多对一、多对多... 还是其他任何一种场景,其逻辑都是一样的。更多的文档请参考:https://mybatis-flex.com/zh/base/field-query.html
MyBatis-Flex v1.3.3 更新如下:
- 新增:添加动态表名和动态 Schema 的支持 #I6VRMF:建议增加动态变动TableInfo schema的扩展和动态表名功能 #I6WS3E:多租户动态数据源是否考虑支持 #I72X21:是否有分表自定义实现?类似mybatis-plus的动态分表
 - 新增:添加 @Table(schema=xxx) 配置的支持 #I6VD6U:@Table注解 schema设置不生效
 - 新增:Left join 等关联查询时,支持直接赋值对象属性的功能
 - 新增:添加 QueryWrapper.toDebugSQL() 方法,方便用于调试
 - 优化:Entity 父子类定义了相同字段时,应已子类优先
 - 优化:对逻辑删除定义的非 Number 和 Bool 类型的 SQL 构建优化
 - 优化:升级 MyBatis 到 3.5.13 最新版本
 - 优化:升级 MyBatis 后,删除冗余的 FlexXMLConfigBuilder 实现
 - 优化:升级 solon 版本,以支持原生编译功能,感谢 @西东
 - 修复:分页查询在 left join 优化是,错误移除的问题
 - 文档:优化 多表查询 的相关文档
 - 文档:添加枚举属性构建 QueryWrapper 的相关文档
 - 文档:添加自定义 MyBatis 的 Configuration 的文档
 
进一步了解 MyBatis-Flex 框架,请参考一下链接:
- 1、快速开始:https://mybatis-flex.com/zh/intro/getting-started.html
 - 2、多表关联查询:https://mybatis-flex.com/zh/base/query.html
 - 3、一对多、多对一:https://mybatis-flex.com/zh/base/field-query.html
 - 4、灵活的 QueryWrapper:https://mybatis-flex.com/zh/base/querywrapper.html
 - 5、逻辑删除:https://mybatis-flex.com/zh/core/logic-delete.html
 - 6、乐观锁:https://mybatis-flex.com/zh/core/version.html
 - 7、数据填充:https://mybatis-flex.com/zh/core/fill.html
 - 6、数据脱敏:https://mybatis-flex.com/zh/core/mask.html
 - 7、SQL 审计:https://mybatis-flex.com/zh/core/audit.html
 - 8、多数据源:https://mybatis-flex.com/zh/core/multi-datasource.htm
 - 9、事务管理:https://mybatis-flex.com/zh/core/tx.html
 - 10、数据权限:https://mybatis-flex.com/zh/core/data-permission.html
 - 11、字段权限:https://mybatis-flex.com/zh/core/columns-permission.html
 - 12、字段加密:https://mybatis-flex.com/zh/core/columns-encrypt.html
 - 13、字典回写:https://mybatis-flex.com/zh/core/columns-dict.html
 - 14、枚举属性:https://mybatis-flex.com/zh/core/enum-property.html
 - 15、动态表名:https://mybatis-flex.com/zh/core/dynamic-table.html
 - 16、多租户:https://mybatis-flex.com/zh/core/multi-tenancy.html
 - 17、代码生成器:https://mybatis-flex.com/zh/others/codegen.html
 - 18、更好用的功能正在路上:https://mybatis-flex.com
 
和其他框架对比请参考:
- 1、和 
MyBatis-Plus、Fluent-Mybatis【功能】方面的对比:https://mybatis-flex.com/zh/intro/comparison.html - 2、和 
MyBatis-Plus【性能】方面的对比:https://mybatis-flex.com/zh/intro/benchmark.html 
感谢大家关注 MyBatis-Flex ,让我们一起携手,打造新一代的 MyBatis 增强框架。
关注公众号
					低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 
							
								
								    上一篇
								    
								
								Dante Cloud 3.1.0.2 发布,核心代码全面适配 Hutool 6.0.0
Dante Cloud 是一款企业级微服务架构和服务能力开发平台,是采用领域驱动设计(DDD)思想的、全面拥抱 Spring Authorization Server 的、基于 OAuth2.1 协议的、支持智能电视、IoT等物联网设备认证的微服务架构。基于 Spring Authorization Server 1.1.0、Spring Boot 3.1.0、Spring Cloud 2022.0.3、Spring Cloud Tencent 1.11.4-2022.0.1、Spring Cloud Alibaba 2022.0.0.0-RC2、Nacos 2.2.3 等主流技术栈开发的多租户系统,遵循 SpringBoot 编程思想,高度模块化和可配置化。具备服务发现、配置、熔断、限流、降级、监控、多级缓存、分布式事务、工作流等功能 平台定位 构建成熟的、完善的、全面的,基于 OAuth2.1 的、前后端分离的微服务架构解决方案。 面向企业级应用和互联网应用设计开发,既兼顾传统项目的微服务化,又满足互联网应用开发建设、快速迭代的使用需求。 平台架构使用微服务领域及周边相关的各类新兴...
 - 
							
								
								    下一篇
								    
								
								智能制造一体化 v3.10.1 发布,招聘模块更新
智能制造一体化管理系统[SpringBoot2 - 快速开发平台],适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模块、动态表单、知识库、公告模块、企业论坛、云售后模块、生产模块、系统模块化同步模块等多种复杂业务功能。 有一些小伙伴很好奇最近更新的内容和智能制造有什么关系? 答:目前 Skyeye 整体在做重构,优先从底层的一些功能开始,所以现在大家看到的和智能制造的联系不是很大,也希望大家能够理解,一个大型的智能制造对底层的依赖性也是非常高的。 智能制造一体化 v3.10.1 发布,更新内容如下: 新增表单布局的功能: 招聘服务:面试者来源管理,人员需求管理 新增组件:岗位信息 表单组件新增前置以及后置的属性 表单布局新增【是否开启工作流】的配置属性 如有需要定制的可以添加我的微信 (wzq_598748873),添加时请备注:姓名 - 联系方式 erp:https://gitee.com/doc_wei01/erp-pro ...
 
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
 - MySQL数据库中FOR UPDATE的使用
 - MySQL8.0.19开启GTID主从同步CentOS8
 - Crontab安装和使用
 - CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
 - CentOS7,CentOS8安装Elasticsearch6.8.6
 - Docker使用Oracle官方镜像安装(12C,18C,19C)
 - CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
 - CentOS6,CentOS7官方镜像安装Oracle11G
 - CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
 

			

				
				
				
				
				
				
				
微信收款码
支付宝收款码