当前位置: 首页 > news >正文

荣欣建设集团有限公司网站广东东莞电子厂

荣欣建设集团有限公司网站,广东东莞电子厂,Wordpress怎样选择主题,上海网站建设需要多少钱在使用 MyBatis-Plus 时,采用动态表名策略后,selectPage 方法无法正常生效。 MyBatis-Plus动态表名插件配置MyBatis-Plus动态表名失效原因MyBatis-Plus动态表名失效解决办法 MyBatis-Plus动态表名插件配置 以下是我项目中 MyBatis - Plus 的插件配置&am…

在使用 MyBatis-Plus 时,采用动态表名策略后,selectPage 方法无法正常生效。

  • MyBatis-Plus动态表名插件配置
  • MyBatis-Plus动态表名失效原因
  • MyBatis-Plus动态表名失效解决办法

MyBatis-Plus动态表名插件配置

以下是我项目中 MyBatis - Plus 的插件配置:

import cn.hutool.core.net.NetUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.dromara.common.core.factory.YmlPropertySourceFactory;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.mybatis.aspect.DataPermissionAspect;
import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler;
import org.dromara.common.mybatis.handler.MybatisExceptionHandler;
import org.dromara.common.mybatis.handler.PlusPostInitTableInfoHandler;
import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;import static org.dromara.common.core.utils.ServletUtils.getLanguage;/*** mybatis-plus配置类*/
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan("${mybatis-plus.mapperPackage}")
@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 数据权限处理interceptor.addInnerInterceptor(dataPermissionInterceptor());// 分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor());// 乐观锁插件interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());// 动态表名插件interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor());return interceptor;}/*** 动态表名插件*/public DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> switch (tableName) {case "device_type","device_model" -> tableName + "_" + getLanguage();default -> tableName;});return dynamicTableNameInnerInterceptor;}/*** 数据权限拦截器*/public PlusDataPermissionInterceptor dataPermissionInterceptor() {return new PlusDataPermissionInterceptor(SpringUtils.getProperty("mybatis-plus.mapperPackage"));}/*** 数据权限切面处理器*/@Beanpublic DataPermissionAspect dataPermissionAspect() {return new DataPermissionAspect();}/*** 分页插件,自动识别数据库类型*/public PaginationInnerInterceptor paginationInnerInterceptor() {PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();// 分页合理化paginationInnerInterceptor.setOverflow(true);return paginationInnerInterceptor;}/*** 乐观锁插件*/public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {return new OptimisticLockerInnerInterceptor();}/*** 元对象字段填充控制器*/@Beanpublic MetaObjectHandler metaObjectHandler() {return new InjectionMetaObjectHandler();}/*** 使用网卡信息绑定雪花生成器* 防止集群雪花ID重复*/@Beanpublic IdentifierGenerator idGenerator() {return new DefaultIdentifierGenerator(NetUtil.getLocalhost());}/*** 异常处理器*/@Beanpublic MybatisExceptionHandler mybatisExceptionHandler() {return new MybatisExceptionHandler();}/*** 初始化表对象处理器*/@Beanpublic PostInitTableInfoHandler postInitTableInfoHandler() {return new PlusPostInitTableInfoHandler();}}

MyBatis-Plus动态表名失效原因

在运用 com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor 时,其 intercept 方法具备这样一种特性:每进行一次 SQL 查询操作,该方法便会对已加载的全部拦截器进行逐一遍历。在实际应用场景中,尤其是当你需要对 device_typedevice_model 库开展动态表名查询时,这一机制可能会带来一些影响。
在这里插入图片描述

举例来说,若你希望依据语言环境动态拼接表名,当当前语言为 zh_CN 时,就会去查询 device_type_zh_CN 表。经过多次测试后发现,使用 selectById 或者 selectList 方法能够顺利完成查询任务,但使用 selectPage 方法时却会报错。经过深入分析,问题的根源在于拦截器的执行顺序存在不当之处。
实际上,在使用 com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor 执行 SQL 查询时,intercept 方法会对以 List 形式存储的拦截器进行遍历。通常情况下,第一个被调用的拦截器是分页查询拦截器,也就是 com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor 类中的 willDoQuery 方法。在这个 willDoQuery 方法里,会触发一次额外的数据库查询操作,而恰恰是这次额外的查询操作,最终引发了报错问题。
在这里插入图片描述

MyBatis-Plus动态表名失效解决办法

通过调整拦截器的顺序,把分页拦截器置于动态表名拦截器之后,便可有效解决当前面临的问题。

import cn.hutool.core.net.NetUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.dromara.common.core.factory.YmlPropertySourceFactory;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.mybatis.aspect.DataPermissionAspect;
import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler;
import org.dromara.common.mybatis.handler.MybatisExceptionHandler;
import org.dromara.common.mybatis.handler.PlusPostInitTableInfoHandler;
import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;import static org.dromara.common.core.utils.ServletUtils.getLanguage;/*** mybatis-plus配置类*/
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan("${mybatis-plus.mapperPackage}")
@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 数据权限处理interceptor.addInnerInterceptor(dataPermissionInterceptor());// 动态表名插件interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor());// 分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor());// 乐观锁插件interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());return interceptor;}/*** 动态表名插件*/public DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> switch (tableName) {case "device_type","device_model" -> tableName + "_" + getLanguage();default -> tableName;});return dynamicTableNameInnerInterceptor;}/*** 数据权限拦截器*/public PlusDataPermissionInterceptor dataPermissionInterceptor() {return new PlusDataPermissionInterceptor(SpringUtils.getProperty("mybatis-plus.mapperPackage"));}/*** 数据权限切面处理器*/@Beanpublic DataPermissionAspect dataPermissionAspect() {return new DataPermissionAspect();}/*** 分页插件,自动识别数据库类型*/public PaginationInnerInterceptor paginationInnerInterceptor() {PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();// 分页合理化paginationInnerInterceptor.setOverflow(true);return paginationInnerInterceptor;}/*** 乐观锁插件*/public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {return new OptimisticLockerInnerInterceptor();}/*** 元对象字段填充控制器*/@Beanpublic MetaObjectHandler metaObjectHandler() {return new InjectionMetaObjectHandler();}/*** 使用网卡信息绑定雪花生成器* 防止集群雪花ID重复*/@Beanpublic IdentifierGenerator idGenerator() {return new DefaultIdentifierGenerator(NetUtil.getLocalhost());}/*** 异常处理器*/@Beanpublic MybatisExceptionHandler mybatisExceptionHandler() {return new MybatisExceptionHandler();}/*** 初始化表对象处理器*/@Beanpublic PostInitTableInfoHandler postInitTableInfoHandler() {return new PlusPostInitTableInfoHandler();}}
http://www.dtcms.com/a/509406.html

相关文章:

  • 群晖做自己的电影网站织梦网站栏目建设
  • 嵌入式开发学习日志41——stm32之SPI总线基本结构
  • 哈尔滨网站建设公司oeminc信息爆炸的时代做网站
  • 网站建设的项目方案模板中国建设企业银行
  • 泉州自助建站软件免费域名注册方式
  • 商城网站哪个公司做的好处羽毛球赛事2022
  • 高邮城乡建设局 网站长春网站建设厂家
  • 浙江城乡建设网站证件查询张家港网站建设服务
  • 【Java工程师面试全攻略】Day14:大数据处理与实时计算深度解析
  • 网上做家教的网站您备案的网站名称没有关联性
  • 互联网科技公司做网站哪家好标题优化seo
  • 宿州精品网站建设建设银行银行官网网站
  • 深圳中国电信网站备案新注册网站
  • 商业网站建设费用网站功能模块建设
  • 固原网站制作高端网站设计制作的
  • 从代码角度分析网站怎么做wordpress商
  • 自己动手建立网站3重庆手机网站推广方法
  • 目前网站软件设计制造中国第一架飞机的人是
  • O(1)时间复杂度实现有setAll功能的哈希表
  • 南昌网站做ppt模板免费的网站推荐
  • 做网站网站庄家北京软件开发公司排
  • 做网站销售门窗怎么做网站建设细化流程
  • 足球梦网站建设的基本思路重庆有几个区
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(4):文法運用
  • 专门做相声的网站百度手机助手app下载官网
  • 邯郸网站关键字优化专科千万别学数字媒体应用技术
  • 网络攻防技术:假消息攻击
  • 刷赞网站推广软件企业网站建设的申请
  • 沈阳工伤保险做实在哪个网站婚礼策划网站建设
  • 企业网站建站wordpress登陆页面