1. 程式人生 > 實用技巧 >shardbatis實現分表

shardbatis實現分表

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實現對應的策略類即可。