首页 > 技术文章 > Mybatis中分表插件shardbatis使用说明

handsomeye 2017-01-22 15:30 原文

  Mybatis中实现分表,有个很简单的插件,叫shardbatis,使用maven构建的工程,可以在pom.xml中添加依赖性即可:

<!-- 分库分表插件 -->
<dependency>
    <groupId>org.shardbatis</groupId>
    <artifactId>shardbatis</artifactId>
    <version>2.0.0B</version>
</dependency>
<!-- sql解析插件 -->
<dependency>
    <groupId>net.sf.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>0.8.0</version>
</dependency>

  使用方式:shardbatis-2.0.0B.jar中有一个ShardStrategy接口,源码如下:

public abstract interface ShardStrategy
{
  public abstract String getTargetTableName(String paramString1, Object paramObject, String paramString2);
}

  用户可以自定义实现该接口的getTargetTableName方法,例如按年月分表实现:

/**
 * 分表策略,自动按当前年月分表
 * @author yehx
 *
 */
public class ShardStrategyByYearMonthImpl implements ShardStrategy {
    
    private static Log log = LogFactory.getLog(ShardStrategyByYearMonthImpl.class);
    
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
    /**
     * 得到实际表名
     * @param baseTableName 逻辑表名,一般是没有前缀或者是后缀的表名
     * @param params        mybatis执行某个statement时使用的参数
     * @param mapperId      mybatis配置的statement id
     * @return
     */

    public String getTargetTableName(String baseTableName,Object params, String mapperId) {
        return baseTableName +"_" + sdf.format(new Date());
    }
}

  按年月分表的实现写好了之后,那这时候就需要配置,哪个mapperId需要按照该策略进行操作,即需要配置shard_config.xml:

<shardingConfig>
    <!-- ignoreList可选配置 ignoreList配置的mapperId会被分表参加忽略解析,不会对sql进行修改,value可配置多个 -->
    <ignoreList>
        <value></value>
    </ignoreList>
    <!-- parseList可选配置 如果配置了parseList,只有在parseList范围内并且不再ignoreList内的sql才会被解析和修改,value可配置多个 -->
    <parseList>
        <value>com.**.mapper.UserMapper.addUser</value>
    </parseList>
    <!-- 配置分表策略 -->
    <strategy tableName="demo_user"
        strategyClass="com.**.splittable.ShardStrategyByDayImpl" />
</shardingConfig> 

  那么,如何加载该文件呢,很简单,只需要在mybatis-config.xml文件中增加插件配置即可,配置如下:

<configuration>
    <!-- 插件配置 -->
    <plugins>
        <!-- 分表插件配置 -->
        <plugin interceptor="com.google.code.shardbatis.plugin.ShardPlugin">  
                <property name="shardingConfig" value="shard_config.xml"/>  
        </plugin> 
    </plugins>
</configuration>

  而mybatis-config.xml文件是在哪加载的呢?是在配置sqlSessionFactory的地方指定的,如用spring的话,则在spring-mybatis.xml中配置:

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- mybatis-config配置文件 -->
    <property name="configLocation" value="classpath:mybatis-config.xml" />
    <!-- 自动扫描mapping.xml文件 -->
    <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>

  好了,配置ok,接下来就可以完美地实现分表的需求了!!!

推荐阅读