代码改变世界

mybatis3分表插件Shardbatis的基本使用

2016-12-09 19:59  hduhans  阅读(1876)  评论(0)    收藏  举报

  随着系统的发展,数据量也会越来越大,当单表数据量达到5000W时读写性能会有明显下降,此时需要分表来提升数据库性能。Shardbatis是一款基于mybatis3的分表插件,它会在执行mysql前,按照指定的分表规则进行table的替换,从而实现分表。

一、在项目中配置Shardbatis

1、引入jar包

   1) shardbatis-2.0.0B.jar(maven资源库好像已经找不到了...源码https://github.com/colddew/shardbatis)

<dependency>
     <groupId>shardbatis</groupId>
     <artifactId>shardbatis</artifactId>
     <version>2.0.0B</version>
</dependency>

    2) jsqlparser-0.8.0.jar

<dependency>
    <groupId>net.sf.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>0.8.0</version>
</dependency>

 2、mybatis配置(mybatis-config.xml)添加插件配置

<plugins>
    <plugin interceptor="com.google.code.shardbatis.plugin.ShardPlugin">
         <property name="shardingConfig" value="shard_config.xml"/>
    </plugin>
</plugins> 

3、添加分表配置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可选的配置,这里的mapper方法不会对sql进行修改 -->
    <ignoreList> 
        <value>com.hicoor.GoodsMapper.insert</value> 
    </ignoreList> 
    <parseList> 
        <value>com.hicoor.UserMapper.insert</value> 
        <value>com.hicoor.UserMapper.update</value> 
    </parseList> 
    <!-- 表名就是t_user,大小写都可 -->
    <strategy tableName="t_user" strategyClass="com.hicoor.common.mybatis.ShardStrategybImpl"/> 
</shardingConfig> 

4、实现自己的分表路由规则,实现ShardStrategy接口getTargetTableName接口即可

package com.hicoor.common.mybatis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.log4j.Logger;
import com.google.code.shardbatis.strategy.ShardStrategy;

public class ShardStrategybImpl implements ShardStrategy {

    /**
     * 分表规则
     * baseTableName是当前表名
     * paramObj是请求参数
     * mapperId是mapper方法路径
     */
    @Override
    public String getTargetTableName(String baseTableName, Object paramObj, String mapperId) {
        // 这里实现分表规则
        return baseTableName;
    }

}
View Code

   至此,配置已完成。