Mybatis中分表插件shardbatis使用说明
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,接下来就可以完美地实现分表的需求了!!!