解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題
使用MyBatis-Plus 我們需要安裝各種插件,比如官網(wǎng)提供的一些分頁(yè)插件等。插件的安裝請(qǐng)參考官網(wǎng),聲明一下我的配置
以下是報(bào)錯(cuò)信息:
org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'dataBaseName.delivery_file_print_log' doesn't exist ### The error may exist in XXMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT COUNT(*) FROM delivery_file_print_log WHERE (status = ?) ### Cause: java.sql.SQLSyntaxErrorException: Table 'dataBaseName.delivery_file_print_log' doesn't exist ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'dataBaseName.delivery_file_print_log' doesn't exist at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) at com.sun.proxy.$Proxy192.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForIPage(MybatisMapperMethod.java:121) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:85) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy277.selectPage(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy278.selectPage(Unknown Source) at com.banksteel.delivery.buy.service.BasicServiceTest.testEmail(BasicServiceTest.java:117) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
以下是我的項(xiàng)目mybaltis—plus的插件配置
```java
/**
* MyBatis配置
*/
@Configuration(proxyBeanMethods = false)
public static class MyBatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(DeliveryProperties props) {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 增加 SQL阻斷解析器,防止全表update、delete
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
// 動(dòng)態(tài)表名
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
// 獲取參數(shù)方法
if ("delivery_file_print_log".equals(tableName)) {
tableName = tableName + "_" +getYear();
}
return tableName;
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
// 樂(lè)觀鎖插件 @version
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 分頁(yè)插件
PaginationInnerInterceptor pagination = new PaginationInnerInterceptor(DbType.MYSQL);
// 設(shè)置最大單頁(yè)限制數(shù)量,默認(rèn)不限制
pagination.setMaxLimit(props.getMaxLimitByPage());
// 設(shè)置請(qǐng)求的頁(yè)面大于最大頁(yè)后操作, true調(diào)回到首頁(yè),false 繼續(xù)請(qǐng)求 默認(rèn)false
// pagination.setOverflow(false)
interceptor.addInnerInterceptor(pagination);
return interceptor;
}
public static String getYear() {
Calendar calendar = Calendar.getInstance();
int yearInt = calendar.get(Calendar.YEAR);
return String.valueOf(yearInt).substring(2);
}
}
其中我需要對(duì)delivery_file_print_log的庫(kù)實(shí)現(xiàn)動(dòng)態(tài)表名的查詢(xún),比如今年是23年,那么查詢(xún)的庫(kù)表應(yīng)該是delivery_file_print_log_23。 經(jīng)過(guò)多次測(cè)試,selectById 或者 selectList方法都是可以正常查詢(xún)的,但是selectPage會(huì)報(bào)錯(cuò)如上,具體的原因是攔截器的順序?qū)е碌膯?wèn)題
com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor#intercept 在每執(zhí)行一次sql查詢(xún)的時(shí)候,都會(huì)遍歷一次加載的攔截器

因?yàn)槭荓ist,所以第一個(gè)使用的是分頁(yè)查詢(xún)攔截器 com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor#willDoQuery

分頁(yè)查詢(xún)的攔截器里面會(huì)進(jìn)行一次查詢(xún)操作,這個(gè)地方會(huì)查詢(xún)數(shù)據(jù)庫(kù),導(dǎo)致報(bào)錯(cuò)。
解決方案:將攔截器的順序調(diào)整,分頁(yè)攔截器調(diào)整在動(dòng)態(tài)表名攔截器之后,完美解決問(wèn)題。
以上就是解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- MyBatis-Plus動(dòng)態(tài)表名使用selectPage方法不生效問(wèn)題解析與解決方案
- MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名
- MyBatis-Plus動(dòng)態(tài)表名的使用
- mybatis-plus動(dòng)態(tài)表名實(shí)現(xiàn)方法
- mybatis-plus動(dòng)態(tài)表名的實(shí)現(xiàn)示例
- MyBatis-Plus 動(dòng)態(tài)表名SQL解析器的實(shí)現(xiàn)
- Mybatis-Plus動(dòng)態(tài)表名的實(shí)現(xiàn)示例
相關(guān)文章
Java Properties簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java中有個(gè)比較重要的類(lèi)Properties(Java.util.Properties),主要用于讀取Java的配置文件,各種語(yǔ)言都有自己所支持的配置文件,配置文件中很多變量是經(jīng)常改變的,這樣做也是為了方便用戶,讓用戶能夠脫離程序本身去修改相關(guān)的變量設(shè)置2017-05-05
利用IDEA工具修改Maven多模塊項(xiàng)目標(biāo)識(shí)包名全過(guò)程記錄
當(dāng)我們?yōu)榧追椒?wù)提供軟件開(kāi)發(fā)服務(wù)時(shí),需要按照甲方的要求去修改軟件的標(biāo)識(shí),對(duì)于Maven項(xiàng)目來(lái)說(shuō)就對(duì)應(yīng)著groupId,一般地寫(xiě)對(duì)方公司的域名,如com.example,接下來(lái)通過(guò)本文給大家分享IDEA修改Maven多模塊項(xiàng)目標(biāo)識(shí)包名,感興趣的朋友一起看看吧2022-09-09
Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題
這篇文章主要介紹了Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Mybatis?大數(shù)據(jù)量批量寫(xiě)優(yōu)化的案例詳解
這篇文章主要介紹了Mybatis?大數(shù)據(jù)量批量寫(xiě)優(yōu)化的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Sleuth+logback 設(shè)置traceid 及自定義信息方式
這篇文章主要介紹了Sleuth+logback 設(shè)置traceid 及自定義信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java重入鎖(ReentrantLock)從入門(mén)到源碼深度解析
本文給大家介紹Java重入鎖(ReentrantLock)從入門(mén)到源碼深度解析,通過(guò)本文學(xué)習(xí)可以全方位地認(rèn)識(shí)ReentrantLock,從基本概念到高級(jí)特性,從使用方式到源碼剖析,從底層原理到實(shí)際應(yīng)用,感興趣的朋友跟隨小編一起看看吧2026-02-02

