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,接下來就可以完美地實現分表的需求了!!!
