一、扩展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,提供多种分表策略动态配置