>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21859 个阅读者 刷新本主题
 * 贴子主题:  mybatis-plus 注解实现多表关联查询的最佳实践 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-06-20 08:57:50     消息  查看  搜索  好友  邮件  复制  引用

这里我们汇总梳理一下常用开发场景中需要涉及到 关联 的场景以及其要支持的绑定方式。

1. 注解自动绑定数据字典(自定义枚举)的显示值Label

开发过程中的枚举值,比如用户状态(ACTIVE:激活,LOCKED:锁定 ...)、身份证类型等,我们会将其名称name和值value定义在数据字典表,以支持扩展不改代码以及用户可编辑。其他数据表中关联该字典时,存储对应的value,显示时又需要查询字典表将value转换为对应的name。

通过注解绑定,我希望简单使用如这样:


@BindDict(type="USER_STATUS", field = "status")
private String statusLabel;

2. 注解自动绑定其他表的字段

如部门实体Department(department表的Java映射对象)对应的VO对象中需要关联组织Organization实体(organization表的映射对象)。

我希望简单使用如这样:


// 支持关联条件+附加条件绑定字段
@BindField(entity=Department.class, field="name", condition="department_id=id AND parent_id>=0")
private String deptName;

// 支持通过中间表的级联关联绑定字段
@BindField(entity = Organization.class, field="name", condition="this.department_id=department.id AND department.org_id=id")
private String orgName;

3. 注解自动绑定其他表实体Entity

如部门实体Department(department表的Java映射对象)对应的VO对象中需要关联组织Organization实体(organization表的映射对象)。

我希望简单使用如这样:


// 支持关联条件+附加条件绑定Entity
@BindEntity(entity = Department.class, condition="department_id=id")
private Department department;

// 通过中间表的级联关联绑定Entity(支持附加条件)
@BindEntity(entity = Organization.class, condition = "this.department_id=department.id AND department.org_id=id AND department.deleted=0")
private Organization organization;

4. 注解自动绑定其他表实体集合List<Entity>

如部门实体Department对应的VO对象中需要关联多个子部门Department实体。

我希望简单使用如这样:


// 支持关联条件+附加条件绑定多个Entity
@BindEntityList(entity = Department.class, condition = "id=parent_id")
private List<Department> children;

// 通过中间表的 多对多关联 绑定Entity(支持附加条件)
@BindEntityList(entity = Role.class, condition="this.id=user_role.user_id AND user_role.role_id=id")
private List<Role> roleList;

实现以上方案,开发过程中的大部分关联场景SQL都可以大大简化,使代码具备极好的可维护性。另外以上方案实现需要拆解成单表查询SQL通过主键去查询,可以充分利用数据库缓存,提高性能。
详细了解其实现代码,请至 Diboot - 简单高效的轻代码开发框架 (欢迎star)


----------------------------
原文链接:https://www.jianshu.com/p/b68a142509e7


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->内部类
  JavaWeb开发-->JavaWeb应用入门(Ⅰ)
  JSP与Hibernate开发-->第一个helloapp应用
  Java网络编程-->XML数据处理
  精通Spring-->Vue组件开发基础
  Vue3开发-->Vue组件开发高级技术
  Maven 安装及环境配置
  从零开始手写 spring ioc 框架,深入学习 spring 源码
  Mybatis-plus大数据量流式查询
  微服务的拆分方式
  Spring AOP的基本概念和注解
  Spring 自动注入的三种方式:byName、byType、constructor
  Spring配置中bean元素的id和name属性的区别
  【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界...
  【项目实践】有了SpringBoot还有必要学SSM整合吗 - RudeCrab...
  Spring数据验证 中@NotNull, @NotEmpty和@NotBlank之间的区别
  什么是Redis?Redis的各项功能解决了哪些问题?
  RabbitMQ的用途、原理以及配置
  网红框架SpringBoot2.x之定制参数浅析
  分布式消息队列RocketMQ部署与监控
  Spring @Transactional注解失效解决方案
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。