发信息做推广,我选黔优网

发布产品信息
微信公众号 微信公众号

mybatis-plus动态表名的具体实现过程以及实现原理

我要举报 黔优网官方账号 时间:2024-12-18 14:02 未知浏览量:31|  阅读时长:11分钟
导读:mybatis-plus动态表名的具体实现过程以及实现原理,为您提供全面的学习指导,一起来看看吧。

业务上有这样的需求,在存储数据的时候会根据某一个字段动态的选择数据要存储的表。本篇文章将会为您详细介绍关于 mybatis-plus 动态表名的具体实现过程以及实现原理,以下是详情内容。

背景

在分表的背景下,有时候查询数据的时候需要跨表查询,那此时就需要MP在解析的时候,能够很好的自适应表格名称

实现

MP中是通过PaginationInterceptor(分页插件)完成动态表名解析的,配置如下:

数据库中表

依赖

<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.3.1.tmp</version>
</dependency>

配置类

package com.huanchuang.common.config;
 
import com.baomidou.mybatisplus.extension.parsers.DynamicTableNameParser;
import com.baomidou.mybatisplus.extension.parsers.ITableNameHandler;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.util.Collections;
import java.util.HashMap;
 

@Configuration
@MapperScan("com.huanchuang.ext.mapper**")
@ConditionalOnProperty(prefix = "spring.config", name = "enableMybatisPlusDynamicTable", havingValue = "true")
public class MybatisPlusDynamicTableConfig {
 
 private static final String DYNAMIC_TABLE_PRE = "common_user";
 
 
 @Bean
 public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(500);
//// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{
 //动态表规则-生成自己需要的动态表名
 put(DYNAMIC_TABLE_PRE, (metaObject, sql, tableName) -> DynamicTableTreadLocal.INSTANCE.getTableName());
}});
paginationInterceptor.setSqlParserList(Collections.singletonList(dynamicTableNameParser));
return paginationInterceptor;
 }
}

动态表名存储类

package com.huanchuang.common.config;
 

public enum DynamicTableTreadLocal {
 INSTANCE;
 private ThreadLocal<String> tableName = new ThreadLocal<>();
 
 public String getTableName() {
return tableName.get();
 }
 
 public void setTableName(String tableName) {
this.tableName.set(tableName);
 }
 
 public void remove() {
tableName.remove();
 }
 
}

使用

 private void select(int year) {
 
 DynamicTableTreadLocal.INSTANCE.setTableName("user_" + year);
 LambdaQueryWrapper<SparkDownSample> wrapper = Wrappers.lambdaQuery(User.class);
 List<User> userList = userMapper.list(wrapper )
 
 }
@Data
public class User {
 
 private Long id;
 
 private String userName;
 
 private String address;
 
 private char sex;
 
 private Byte age;
 
}

原理

以mybatis的query方法作为入口通过动态代理执行到配置的分页插件通过分页插件进行sql解析根据分页插件中配置的tableNameHandler进行目标表格的替换最后形成一个可执行sql,执行查询

本篇关于 mybatis-plus 动态表名的具体实现过程以及实现原理的内容就介绍到此技术了,想要了解更多相关 mybatis-plus 动态表名的其他详细内容请搜索W3Cschool以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!

 
  • 下一篇: 恶搞Google Translate: 揭秘背后的有趣功能和隐蔽彩蛋
  • 上一篇: Google搜索技巧:如何找到您的目标客户
 
没用 0举报 收藏 0评论 0
免责声明:
本页信息由“黔优网官方账号”发布,黔优网作为免费B2B信息发布平台,已对用户身份进行实名验证并对内容进行形式审核。信息的真实性、合法性由发布者独立承担全部责任,平台不承担内容准确性保证责任。本文涉及见解与观点不代表黔优网官方立场,交易决策前请务必自行核实,风险自负。原文链接:https://www.qianu.com/n/934658.html。如发现侵权或虚假内容,请【投诉举报】联系我们处理。
 
 

 
推荐图文资讯