免费发布信息
微信公众号
当前位置: 首页 » 帮助中心 » 常见问题 » 正文

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

   来源:黔优网时间:2024-12-18 14:02:16 浏览量:0

业务上有这样的需求,在存储数据的时候会根据某一个字段动态的选择数据要存储的表。本篇文章将会为您详细介绍关于 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以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!

 
 
没用 0举报 收藏 0
免责声明:
黔优网以上展示内容来源于用户自主上传、合作媒体、企业机构或网络收集整理,版权争议与本站无关,文章涉及见解与观点不代表黔优网官方立场,请读者仅做参考。本文标题:mybatis-plus动态表名的具体实现过程以及实现原理,本文链接:https://www.qianu.com/help/112009.html,欢迎转载,转载时请说明出处。若您认为本文侵犯了您的版权信息,或您发现该内容有任何违法信息,请您立即点此【投诉举报】并提供有效线索,也可以通过邮件(邮箱号:kefu@qianu.com)联系我们及时修正或删除。
 
 

 

 
推荐图文
推荐帮助中心