Mybatis分表+分页实现原理和注意事项

实现原理
  • 使用SpringAOP拦截方法 + 实现Interceptor拦截SQL + ThreadLocal存储分表信息
  • 首先在ShardingTableAspect配置@Pointcut("execution(* com.xxx.xxx.dao.sharding.*.*(..))") 用来拦截sharding目录下的所有方法
  • 在环绕通知daoAround中获取被拦截方法参数中@ShardingKey注解对应的field的值,和类注解@TableSharding定义的tableName存入ThreadLocal
  • ShardingInterceptor实现Interceptor,在mybatis组装完SQL会进入intercept,在方法中获取ThreadLocal中的分表信息,根据分表信息替换为新的表名
注意事项
  • 配置插件时,Order顺序是有意义的,如果先shardingInterceptor没有办法拦截select count()因为这条语句是paginationInterceptor生成的,如果如果先paginationInterceptor,获取statementHandler一定要进行递归获取真正的对象,因为select count()是属于被代理的
    @Bean
    @Order(102)
    public ShardingInterceptor shardingInterceptor() {
        return new ShardingInterceptor();
    }
    
    /**
     * 分页插件
     */
    @Bean
    @Order(101)
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值