Shardbatis的名称由shard(ing)+mybatis组合得到,是谷歌的一款开源软件。旨在为mybatis实现数据水平切分的功能。数据的水平切分包括多数据库的切分和多表的数据切分,目前shardbatis只实现了单数据库的数据多表水平切分。Shardbatis对mybatis的代码无侵入,不改变用户对mybatis的使用习惯。
1.配置pom文件依赖
<!-- pom中引入依赖 -->
<dependency>
<groupId>org.shardbatis</groupId>
<artifactId>shardbatis</artifactId>
<version>2.0.0B</version>
</dependency>
<!-- 由于googlecode已关闭远程仓库,已不可用 -->
<repository>
<id>shardbaits</id>
<name>shardbaits repository</name>
<url>http://shardbatis.googlecode.com/svn/trunk/repository</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
由于googlecode已关闭远程仓库,以上依赖已不可用,可以考虑将其源码复制下来放入自己的工程里面: shardbatis
2.mybaits配置文件mybatis-config.xml中配置下插件
<plugins>
<plugin interceptor="com.google.code.shardbatis.plugin.ShardPlugin">
<property name="shardingConfig" value="shard_config.xml"/>
</plugin>
</plugins>
3.在resources目录下放置shardbatis的配置文件shard_config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE shardingConfig PUBLIC "-//shardbatis.googlecode.com//DTD Shardbatis 2.0//EN"
"http://shardbatis.googlecode.com/dtd/shardbatis-config.dtd">
<shardingConfig>
<!--
ignoreList可选配置
ignoreList配置的mapperId会被分表参加忽略解析,不会对sql进行修改
-->
<ignoreList>
<value></value>
</ignoreList>
<!--
parseList可选配置
如果配置了parseList,只有在parseList范围内并且不再ignoreList内的sql才会被解析和修改
-->
<parseList>
<!-- t_table -->
<value>com.sam.mappers.TTable.selectByExample</value>
<value>com.sam.mappers.TTable.insertSelective</value>
</parseList>
<!--
配置分表策略 :策略类需要在后续步骤中实现
-->
<strategy tableName="t_table" strategyClass="com.sam.strategy.TTableStrategy"/>
</shardingConfig>
4.实现上述2中配置的分表策略TTableStrategy
该类实现com.google.code.shardbatis.strategy.ShardStrategy接口,并重写接口getTargetTableName,其中参数baseTableName就是mybatis的mapper.xml文件中的表名,param就是方法传递的参数,mapperId就是方法名;这些参数值都是插件自动获取的。
方法返回的tableName就是真实要操作的表名,插件会把mapper.xml文件中的表名替换为该返回的tableName,然后进行sql操作
public class TTableStrategy implements ShardStrategy {
@Override
public String getTargetTableName(String baseTableName, Object param, String mapperId) {
String tableName = baseTableName;
String partitionId = null;
if (param instanceof TTable) {
//这里的TTable是表名对应的实体类,对象的partitionId是在调用mapper接口前设定好的
TTable obj= (TTable) param;
partitionId = ojb.getPartitionId();
} else if (param instanceof TTableExample) {
//TTableExample是mybatis插件自动生成的代码,用过mybatis-generate插件的肯定了解,不多说;对象的partitionId是在调用mapper接口前设定好的
TTableExample obj= (TTableExample) param;
partitionId = obj.getPartitionId();
}
if(!StringUtils.isNullOrEmpty(partitionId)){
tableName = tableName + "_" + partitionId;
}
return tableName;
}
}
5.添加新的分表
如果项目上已经实现了shardbatis分表,要新增一个新的要分表的表,只需要修改步骤3中的配置文件并按照步骤4实现对应的策略类即可。