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="https://www.cnblogs.com/sam-uncle/p/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" strategy/>
</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實作對應的策略類即可,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/200000.html
標籤:Java
