tkMapper分表实现

2,337 阅读1分钟

官网文档:github.com/abel533/Map…

一、扩展tkMapper接口

package tk.mybatis.mapper.entity;

/**
 * 实现动态表名时,实体类需要实现该接口
 *
 * @author liuzh
 * @since 2015-10-28 22:20
 */
public interface IDynamicTableName {

    /**
     * 获取动态表名 - 只要有返回值,不是null和'',就会用返回值作为表名
     *
     * @return
     */
    String getDynamicTableName();
}

二、自定义分表逻辑

//分表后缀
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Shard {
    public String tableSuffix;
}

//待分表的entity继承该抽象类
public abstract class AbstractShardEntity implements IDynamicTableName {

  private Shard shard;

  public void setShard(Shard shard) {
    this.shard = shard;
  }

  @Override
  public String getDynamicTableName() {
    if (shard == null) {
      throw new IllegalArgumentException("Shard can't be null.");
    }

    StringBuffer tableName = new StringBuffer(this.getClass().getAnnotation(Table.class).name());

    return tableName.append(shard.getTableSuffix()).toString();
  }
}

//使用自定义分表Example
public class ShardExample extends Example {

  public ShardExample(Class<?> entityClass) {
    super(entityClass);
  }

  private Shard shard;

  public void setShard(Shard shard) {
    this.shard = shard;
  }

  @Override
  public String getDynamicTableName() {
    if (shard == null) {
      throw new IllegalArgumentException("shard can't be null");
    }
    return super.table.getName() + shard.getTableSuffix();
  }
}

/**
 * 分表策略,此处是按id取模,可自定义实现不同的分表策略
 */
public class ModShardStrategy {
  public static Shard getTableShard(Long id, int modSize) {
    long suffix = id % modSize;
    Shard result = new Shard(String.valueOf(suffix));
    return result;
  }
}

三、使用方式

@Table(name = "tb_user")
public class User extends AbstractShardEntity implements Serializable {
    //...需要分表的entity需要继承AbstractShardEntity
    //...
}

//example用法
ShardExample example = new ShardExample(User.class);
example.setShard(ModShardStrategy.getTableShard(orgId, modSize));

//entity用法
User user = new User();
user.setShard(ModShardStrategy.getTableShard(orgId, modSize));

四、更多扩展

参考:https://blog.csdn.net/luckyxiaobaiyang/article/details/82896791

可自定义实现分表注解:@ShardTable,提供多种分表策略动态配置