mybatis-plus動(dòng)態(tài)表名的實(shí)現(xiàn)示例
背景
在分表的背景下,有時(shí)候查詢數(shù)據(jù)的時(shí)候需要跨表查詢,那此時(shí)就需要MP在解析的時(shí)候,能夠很好的自適應(yīng)表格名稱
實(shí)現(xiàn)
MP中是通過PaginationInterceptor(分頁(yè)插件)完成動(dòng)態(tài)表名解析的,配置如下:
數(shù)據(jù)庫(kù)中表
依賴
<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; /** * @Package: com.huanchuang.common.config * @Description: <mybatis-plush配置類> * @Author: MILLA * @CreateDate: 2020/09/04 14:42 * @UpdateUser: MILLA * @UpdateDate: 2020/09/04 14:42 * @UpdateRemark: <> * @Version: 1.0 */ @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"; /** * mybatis-plus分頁(yè)插件 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 設(shè)置請(qǐng)求的頁(yè)面大于最大頁(yè)后操作, true調(diào)回到首頁(yè),false 繼續(xù)請(qǐng)求 默認(rèn)false paginationInterceptor.setOverflow(false); // 設(shè)置最大單頁(yè)限制數(shù)量,默認(rèn) 500 條,-1 不受限制 paginationInterceptor.setLimit(500); // // 開啟 count 的 join 優(yōu)化,只針對(duì)部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser(); dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{ //動(dòng)態(tài)表規(guī)則-生成自己需要的動(dòng)態(tài)表名 put(DYNAMIC_TABLE_PRE, (metaObject, sql, tableName) -> DynamicTableTreadLocal.INSTANCE.getTableName()); }}); paginationInterceptor.setSqlParserList(Collections.singletonList(dynamicTableNameParser)); return paginationInterceptor; } }
動(dòng)態(tài)表名存儲(chǔ)類
package com.huanchuang.common.config; /** * @Package: com.huanchuang.common.config * @Description: <動(dòng)態(tài)表格存儲(chǔ)類> * @Author: MILLA * @CreateDate: 2020/09/04 14:42 * @UpdateUser: MILLA * @UpdateDate: 2020/09/04 14:42 * @UpdateRemark: <> * @Version: 1.0 */ 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方法作為入口通過動(dòng)態(tài)代理執(zhí)行到配置的分頁(yè)插件通過分頁(yè)插件進(jìn)行sql解析根據(jù)分頁(yè)插件中配置的tableNameHandler進(jìn)行目標(biāo)表格的替換最后形成一個(gè)可執(zhí)行sql,執(zhí)行查詢
到此這篇關(guān)于mybatis-plus動(dòng)態(tài)表名的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)mybatis-plus 動(dòng)態(tài)表名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一篇文章帶你了解MySQL數(shù)據(jù)庫(kù)基礎(chǔ)
這篇文章主要介紹了MySql數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)點(diǎn),總結(jié)整理了mysql數(shù)據(jù)庫(kù)基本創(chuàng)建、查看、選擇、刪除以及數(shù)據(jù)類型相關(guān)操作技巧,需要的朋友可以參考下2021-08-08SpringBoot環(huán)境下junit單元測(cè)試速度優(yōu)化方式
這篇文章主要介紹了SpringBoot環(huán)境下junit單元測(cè)試速度優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09