`

mybatis3分表插件shardbatis 2.0

    博客分类:
  • java
阅读更多
shardbait2.0实现分表的功能可以用一句话描述:使用mybatis3的插件机制在执行sql之前对原始sql的里的表名进行修改。

一、配置:
1.在mybatis配置文件中添加插件配置
<plugins>
        <plugin interceptor="com.google.code.shardbatis.plugin.ShardPlugin">
                <property name="shardingConfig" value="shard_config.xml"/>
        </plugin>
</plugins> 

2.实现自己的sharding策略
实现一个简单的接口即可
/**
 * 分表策略接口
 * @author sean.he
 *
 */
public interface ShardStrategy {
        /**
         * 得到实际表名
         * @param baseTableName 逻辑表名,一般是没有前缀或者是后缀的表名
         * @param params mybatis执行某个statement时使用的参数
         * @param mapperId mybatis配置的statement id
         * @return
         */
        String getTargetTableName(String baseTableName,Object params,String mapperId);
}

public class TestShardStrategyImpl implements ShardStrategy {
	// 最简单的实现修改表名的逻辑
	public String getTargetTableName(String baseTableName, Object params,
			String mapperId) {
		return baseTableName+"_xx";
	}

}

3.添加sharding配置
新建一个xml文件,例如: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>com.google.code.shardbatis.test.mapper.AppTestMapper.insertNoShard</value>
        </ignoreList>
        <!-- 
                parseList可选配置
                如果配置了parseList,只有在parseList范围内并且不再ignoreList内的sql才会被解析和修改
        -->
        <parseList>
                <value>com.google.code.shardbatis.test.mapper.AppTestMapper.insert</value>
        </parseList>
        <!-- 
                配置分表策略
        -->
        <strategy tableName="APP_TEST" strategyClass="com.google.code.shardbatis.strategy.impl.AppTestShardStrategyImpl"/>      
</shardingConfig>

shard_config.xml必须保存在应用的classpath中

二、代码中使用shardbatis
因为shardbatis2.0使用插件方式对mybatis功能进行增强,因此使用配置了shardbatis的mybatis3和使用原生的mybatis3没有区别
SqlSession session = sqlSessionFactory.openSession();
try {
        AppTestMapper mapper = session.getMapper(AppTestMapper.class);
  mapper.insert(testDO);
        session.commit();
} finally {
        session.close();
}


更多详细信息请移步google code:http://code.google.com/p/shardbatis/
3
2
分享到:
评论
19 楼 dsjt 2014-06-25  
悲剧啊,google code 被墙了
18 楼 SeanHe 2014-05-22  
seedpip 写道
SeanHe 写道
seedpip 写道
不好意思我要吐槽下0.9版本。
pom的依赖太乱了,一些不必要的jar包没有exclude掉。
尤其还把ibatis的一些类打在自己的jar包里面,这不是玩死人的节奏吗?

0.9版本是应为ibatis 2没有提供扩张机制,只有直接修改原有代码。


我用的是ibatis2,所以只好用0.9.
试验了一下运行时发生类型转换错误,实际上就是一些类加载的是ibatis原生的,而不是楼主修改的。
因为同包名,就不太敢用了,有风险,以后要是出问题会查半天。

按同样的实现原理自己打造一个好了,当时做也是主要为研究IBATIS源码。可以看下淘宝开源的tddl
17 楼 seedpip 2014-05-21  
SeanHe 写道
seedpip 写道
不好意思我要吐槽下0.9版本。
pom的依赖太乱了,一些不必要的jar包没有exclude掉。
尤其还把ibatis的一些类打在自己的jar包里面,这不是玩死人的节奏吗?

0.9版本是应为ibatis 2没有提供扩张机制,只有直接修改原有代码。


我用的是ibatis2,所以只好用0.9.
试验了一下运行时发生类型转换错误,实际上就是一些类加载的是ibatis原生的,而不是楼主修改的。
因为同包名,就不太敢用了,有风险,以后要是出问题会查半天。
16 楼 SeanHe 2014-05-21  
seedpip 写道
不好意思我要吐槽下0.9版本。
pom的依赖太乱了,一些不必要的jar包没有exclude掉。
尤其还把ibatis的一些类打在自己的jar包里面,这不是玩死人的节奏吗?

0.9版本是应为ibatis 2没有提供扩张机制,只有直接修改原有代码。
15 楼 seedpip 2014-05-20  
不好意思我要吐槽下0.9版本。
pom的依赖太乱了,一些不必要的jar包没有exclude掉。
尤其还把ibatis的一些类打在自己的jar包里面,这不是玩死人的节奏吗?
14 楼 SeanHe 2014-05-09  
czbabl 写道
只能对一个数据源,我要对多个数据源就不行了。比如表user_1,user_2到user_25放到192.168.1.1机器上,表user_26到user_50放到 192.168.1.2的机器上。

请使用淘宝开源的tddl
13 楼 liuxuejin 2014-05-09  
您好 你这个方案是线上在使用的吗?? 好像你还有另外的一个分表的ddl呢
12 楼 youjianbo_han_87 2014-04-23  
按照这种分表的策略,是不是会同时生成建表语句先?
11 楼 czbabl 2014-04-21  
只能对一个数据源,我要对多个数据源就不行了。比如表user_1,user_2到user_25放到192.168.1.1机器上,表user_26到user_50放到 192.168.1.2的机器上。
10 楼 SeanHe 2013-11-29  
bearsu_zhou 写道
兄弟,是否可以给出一个shardbatis+spring3的集成的demo 啊

谢谢你的关注,周末我抽空整一下。
9 楼 bearsu_zhou 2013-11-27  
兄弟,是否可以给出一个shardbatis+spring3的集成的demo 啊
8 楼 SeanHe 2012-05-23  
idreamblue 写道
mybatis3有没有分库插件啊?同一个Mapper我想根据用户ID动态选择数据库,而且还有支持分布式事务。我已经问了几个大牛,都没有解决。


淘宝开源了 TDDL http://code.taobao.org/p/tddl-dynamic-datasource/src/ 你可以看一下

阿里巴巴 开源的Cobar Client  http://code.alibabatech.com/docs/cobarclient/zh/ 你也可以看一下
7 楼 idreamblue 2012-05-23  
mybatis3有没有分库插件啊?同一个Mapper我想根据用户ID动态选择数据库,而且还有支持分布式事务。我已经问了几个大牛,都没有解决。
6 楼 SeanHe 2012-04-06  
makemyownlife 写道
请问下  我们这里的 sql里的表名 是通过什么方式 更改为 tableName++ xxx这种形式呢?
望帮助一下。


shardbatis对sql的解析是基于jsqlparser,shardbatis进行sql convert的代码在com.google.code.shardbatis.converter包下,欢迎拍砖。
5 楼 makemyownlife 2012-04-04  
请问下  我们这里的 sql里的表名 是通过什么方式 更改为 tableName++ xxx这种形式呢?
望帮助一下。
4 楼 tywo45 2011-10-25  
非常感谢博主,等有环境的时候,我试试!
3 楼 SeanHe 2011-10-25  
tywo45 写道
如果是mybatis + spring的架构,在这个架构中是没有mybatis配置文件的,这时候如何添加你这个插件呢?


你好,感谢你对shardbatis的关注
我看了一下plugin和SqlSessionFactoryBean 的实现发现不用mybatis配置文件天然就可支持。
主要是这样配置
<bean id="shardPlugin" class="com.google.code.shardbatis.plugin.ShardPlugin ">
	<property name="properties">
		<props>
			<prop key="shardingConfig">
				shard_config.xml
			</prop>
		</props>
	</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="plugins">
  	<list>
  		<ref bean="shardPlugin"/>
  	</list>
  </property>
</bean>

你可以先试一下,有问题再联系我。
2 楼 tywo45 2011-10-24  
如果是mybatis + spring的架构,在这个架构中是没有mybatis配置文件的,这时候如何添加你这个插件呢?
1 楼 D04540214 2011-08-08  
这个解决方案比上次那个优雅多了,也多亏mybatis提供了这个机制! 有空给我们几个详细讲讲

相关推荐

    spring+mybatis下分表插件shardbatis

    而Shardbatis则是一个专门针对Spring和MyBatis设计的分库分表插件,用于简化数据库分片的实现过程。 首先,我们需要理解Spring的核心概念。Spring是一个开源的Java平台,它提供了全面的软件基础设施服务,用于构建...

    Mybatis分库分表扩展插件

    4. **注入Mybatis**:配置Mybatis的`plugins`元素,指定分库分表插件类,使Mybatis在执行SQL时调用插件。 四、实际应用示例 以mybatis-sharding插件为例,这是一个开源的Mybatis分库分表解决方案。它提供了丰富的...

    mybatis代码生成插件

    MyBatis Code Generator 插件是一款非常实用的工具,它极大地简化了开发人员在使用MyBatis框架时的代码编写工作。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码...

    转:Mybatis分库分表扩展插件

    本文将深入探讨Mybatis分库分表插件的核心概念、工作原理以及实际应用。 首先,我们要了解分库分表的基本概念。分库是指将一个大数据库拆分成多个小数据库,每个数据库存储一部分数据,这样可以分散数据库的负载。...

    idea离线安装mybatis-X插件

    idea离线安装mybatis-X插件

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    本项目基于Java、SpringBoot、MyBatis以及ShardingJDBC实现了一个分库分表的解决方案,旨在帮助开发者理解并掌握这一技术。以下是关于这些技术的详细介绍: **Java**: Java是一种广泛使用的面向对象的编程语言,...

    mybatisx官方插件

    MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。 安装方法:打开 IDEA,进入 File -&gt; Settings -&gt; Plugins -&gt; Browse Repositories,输入 mybatisx 搜索并安装。 无法打开的,下载插件安装

    mybatis逆向工程插件

    MyBatis逆向工程插件,也被称为MyBatis Generator(MBG),是MyBatis框架的一个强大工具,主要用于自动生成MyBatis的Mapper接口、XML映射文件以及实体类,极大地提高了开发效率。这个插件能够根据数据库中的表结构...

    IntelliJ IDEA2018安装mybatis_plus插件

    ### IntelliJ IDEA 2018 安装 Mybatis_Plus 插件详解 在Java开发领域,IntelliJ IDEA 是一款极为流行的集成开发环境(IDE),它提供了丰富的功能来提高开发效率。对于使用MyBatis框架进行数据库操作的开发者来说,...

    mybatis_eclipse_插件

    Eclipse 插件则为MyBatis的开发带来了极大的便利,使得在IDE中可以更加高效地进行MyBatis相关的工作。本资料集合包含了完整的MyBatis Eclipse 插件的安装、配置以及使用教程,非常适合初学者和有一定经验的开发者...

    mybatis物理分页插件

    而“mybatis物理分页插件”是针对MyBatis设计的一个扩展,用于解决在大数据量查询时的性能问题,通过实现物理分页来避免内存溢出。 物理分页是指在数据库层面进行分页,相比于逻辑分页(在应用层进行数据截取),...

    springmvc下的mybatis的sharding分表

    springmvc下的mybatis的sharding分表,执行resources下的database.sql建立mysql的分表,修改applicationContext.xml的数据库用户名和密码,既可以运行maven项目,详细开发过程如我的博客地址:...

    基于mybatis框架,数据库垂直、水平拆分及读写分离实现

    在MyBatis中,可以自定义插件实现一致性哈希的计算,将数据映射到相应的分表。 总结来说,基于MyBatis的数据库拆分和读写分离实现,涉及到对MyBatis框架的深入理解和扩展,包括对SqlSessionTemplate的改造、数据库...

    mybatis 逆向工程插件

    MyBatis逆向工程插件是一款强大的工具,它极大地简化了数据库模型到Java实体类、Mapper接口以及XML配置文件的创建过程。这个插件能够自动根据数据库表结构生成相应的Java代码,大大提高了开发效率,降低了手动编写...

    mybatis慢SQL插件

    基于mybatis的慢SQL小插件,原理是mybatis拦截器。只需要在springboot的配置文件做简单的配置,mybatis拦截器将SQL中所有参数自动做了填充。拦截器监控慢SQL并将完整的可执行的SQL语句打印在日志文件中,复制该SQL...

    MybatisX 快速开发插件

    MybatisX 快速开发插件是一款专为Java开发者设计的高效工具,旨在提升使用Mybatis框架进行开发的工作效率。这款插件是针对IntelliJ IDEA(简称IDEA)集成开发环境的扩展,通过集成在IDEA中,它能够提供一系列便捷的...

    mybatis generator eclipse插件的安装

    下面我们将详细介绍如何在Eclipse中安装和使用MyBatis Generator插件。 首先,我们需要获取MBG的插件文件。通常,你可以从官方网站或者第三方资源站点下载到`mybatis-generator-eclipse-plugin`的zip压缩包。下载...

    06实现mybatis分页插件demo

    06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo06实现mybatis分页插件demo...

Global site tag (gtag.js) - Google Analytics