最近项目中有几张业务表数据量较其他业务表数据量大很多,所有就考虑分表。因为DAO层使用的是tk.mybatis通用插件,所以就抽时间看了下 tk.mybatis源码,以求得不改变任何业务代码实现个性化分表功能。最终得到以下实现方案。
1、tk.mybatis中有一个IDynamicTableName接口,实现此接口就可在CRUD中实现动态表名。
2、创建DynamicTableEntity抽象实体类,实现IDynamicTableName接口,之后所有与数据库表对应的实体类都要继承该抽象类。实现方法如下,
3、示例业务entity如下UserInfo,@Table注解name属性为未分表前原表名,@DefTable为自定义分表注解,其属性value表示分表个数。
4、如下为@DefTable类容
5、 以上内容已经可以适用普通CRUD方法的动态表需求了,但是还不满足通用的Example查询对象对分表的要求。所以以下为对Example的扩展实现。
这样扩展通用Example查询对象构造函数入参将不再是Class对象,而是对象实例。
到此为止,基于tk.mybatis的分表功能已实现,分表后的n张表名为原表名(例如TableTest)末尾加 “_0到_n-1”的新表名,TableTest_0 到TableTest_n-1