mybatis拦截器分表

mybatis提供了拦截器插件用来处理被拦截的方法的某些逻辑.下面会通过创建8张表,当用户注册时,根据对手机号取余入不同的表.

建表

引入插件

<property name="plugins">
    <array>
        <bean id="sharingInterceptor" class="com.lios.base.sharetable.SharingInterceptor"/>
    </array>
</property>

拦截器

具体代码:

/**
 * @author LiosWong
 * @description
 * @date 2018/7/31 下午7:05
 */
@Intercepts(@Signature(type = StatementHandler.class,method = "prepare",args = {Connection.class,Integer.class}))
public class SharingInterceptor implements Interceptor{
    Logger logger = LoggerFactory.getLogger(SharingInterceptor.class);
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
        MetaObject metaObject = MetaObject.forObject(statementHandler,SystemMetaObject.DEFAULT_OBJECT_FACTORY,SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,reflectorFactory);
        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
        String id = mappedStatement.getId();
        id = id.substring(0,id.lastIndexOf("."));
        Class cls = Class.forName(id);
        SegmentTable segmentTable = (SegmentTable) cls.getAnnotation(SegmentTable.class);
        if(segmentTable!=null){
            String sql = (String) metaObject.getValue("delegate.boundSql.sql");
            BoundSql boundSql = statementHandler.getBoundSql();
            String tableKey = StrategyFactory.createShareStrategy(segmentTable.shareType()).setSegmentTable(segmentTable).setBoundSql(boundSql).getRouteValue();
            metaObject.setValue("delegate.boundSql.sql",sql.replaceFirst(segmentTable.tableName(),segmentTable.tableName()+tableKey));
        }
        return invocation.proceed();
    }
    @Override
    public Object plugin(Object target) {
        if(target instanceof StatementHandler){
            return Plugin.wrap(target,this);
        }
        return target;
    }
    @Override
    public void setProperties(Properties properties) {

    }
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SegmentTable {
    /**
     * 表名称
     * @return
     */
    String tableName()  default "";


    /**
     * 分表策略
     * @return
     */
    ShareType shareType() default ShareType.MOD;


    /**
     * 分表数量
     * @return
     */
    int tableNum() default 0;

    /**
     * 分表数量
     * @return
     */
    String shareBy() default "";
}
@Repository
@DataSource(value = DynamicDataSourceGlobal.LOCAL)
@SegmentTable(tableName = "user",shareType = ShareType.MOD,tableNum = 8,shareBy = "mobile")
public class UserInfoDaoImpl extends AbstractBaseMapper<UserInfoEntity> implements UserInfoDao{
    @Override
    public UserInfoEntity selectById(Long id) {
        return this.getSqlSession().selectOne(this.getStatement(".selectById"),id);
    }
    @Override
    public UserInfoEntity selectByMobile(String mobile) {
        return this.getSqlSession().selectOne(this.getStatement(".selectByMobile"),mobile);
    }
    @Override
    public UserInfoEntity insert(UserInfoEntity userInfoEntity){
        this.getSqlSession().insert(this.getStatement(".insert"),userInfoEntity);
        return null;
    }
}

StrategyFactory根据不同分表策略处理相应的逻辑,拦截器里主要思路就是拦截需要处理的方法,然后对拦截参数、拦截结果集处理,然后重新构建sql语句并执行.

数据录入

原文发布于微信公众号 - 后端沉思录(LiosWangs)

原文发表时间:2018-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

聊聊eureka的delta配置

eureka-client-1.8.8-sources.jar!/com/netflix/discovery/DiscoveryClient.java

961
来自专栏ImportSource

微服务弹性框架hystrix-javanica详解(上)

Java语言相比其他语言有一些比较great的优点,那就是反射(refleaction)和注解(annotation)。 几乎所有的流行框架比如Spring, ...

50510
来自专栏IT笔记

SpringBoot开发案例之整合mongoDB

? mongodb.jpg 开始前,建议大家去了解以下文章,当然不看也没问题: MongoDB从入门到“精通”之简介和如何安装 MongoDB从入门到“精通”...

5648
来自专栏纯洁的微笑

springboot(十八):使用Spring Boot集成FastDFS

上篇文章介绍了《如何使用Spring Boot上传文件》,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中。 这个项目会...

5024
来自专栏我是攻城师

在Lucene或Solr中实现高亮的策略

3805
来自专栏技术专栏

慕课网高并发实战(三)- 项目准备

项目采用springboot基础框架快速开发,具体初始化方法不再赘述,不明白的可以看课程或者自行百度

1731
来自专栏jeremy的技术点滴

mybatis-generator使用备忘

3904
来自专栏Phoenix的Android之旅

Dagger2 Android应用:@Scope和@Subcomponent

这部分会介绍Dagger2中比较莫名的概念,同样也不涉及Android的具体代码。 Dagger2使用中的核心技巧包括@Subcomponent和@Scope,...

1032
来自专栏Lambda

编程规范

领域层–编码规范 2018年4月4日14:10:38 Controller层编写规范 controller层只是负责从service层获得数据,对外暴露API接...

3646
来自专栏DT乱“码”

JSP+ajax+springMVC+MayBatis处理excel上传导入

jsp <div class="subtext1"> <div cla...

2959

扫码关注云+社区

领取腾讯云代金券