Mybatis实现分库分表

https://www.jianshu.com/p/ba27cb6177e9

正文

首先实现org.apache.ibatis.plugin.Interceptor接口,复写以下三个方法:

//实现拦截逻辑的地方,内部要通过invocation.proceed()显式地推进责任链前进,
//也就是调用下一个拦截器拦截目标方法

Object intercept(Invocation invocation) throws Throwable; //用当前这个拦截器生成对目标target的代理,实际是通过Plugin.wrap(target,this)来完成的, //把目标target和拦截器this传给了包装函数 Object plugin(Object target); //设置额外的参数,参数配置在拦截器的Properties节点里 void setProperties(Properties properties); 

如果想要拦截所有的sql,在实现类上添加 annotation

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})}) 

注:Mybatis支持对Executor、StatementHandler、PameterHandler和ResultSetHandler进行拦截,也就是说会对这4种对象进行代理。

框架如上,具体实现有两个重要点:

1 表的拆分规则

可以在Mapper对象中加上一个annotation,按以下方式去获取:

String className = id.substring(0, id.lastIndexOf("."));

Class  classObj = Class.forName(className);

//根据配置自动生成分表SQL TableSeg tableSeg = classObj.getAnnotation(TableSeg.class); 

TableSeg对象定义:

@Target({ ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented public @interface TableSeg { /** * 表名 * @return */ public String tableName(); /** * 分表方式,取模,如%5:表示取5余数, * 如果不设置,直接根据shardBy值分表 * @return */ public String shardType(); /** * 根据什么字段分表 * 多个字段用数学表达表示,如a+b a-b * @return */ public String shardBy(); } 
2 sql解析与替换

可以通过以下方法去获取BoundSql,这个对象有关于这个sql的内容

StatementHandler statementHandler = (StatementHandler) invocation.getTarget();

BoundSql boundSql = statementHandler.getBoundSql();

目前看到一些常规做法都是利用string 的replace方案替换sql中的表名,这显然一个埋坑的做法。利用词法分析器才是完美方案,可以使用antlr4,grammar文件可以去github上找到。

antlr值得深入学习。


总结

在编写插件时需注意以下几个原则:

1)不编写不必要的插件;

2)实现plugin方法时判断一下目标类型,是本插件要拦截的对象才执行Plugin.wrap方法,否者直接返回目标本省,这样可以减少目标被代理的次数。



作者:harry_chen
链接:https://www.jianshu.com/p/ba27cb6177e9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/davidwang456/articles/8995401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis分库分表实现可以通过使用Sharding-JDBC来实现。Sharding-JDBC是一个开源的分库分表中间件,它可以将数据库的数据分散存储在多个数据库中,从而提高数据库的性能和扩展性。 在使用Sharding-JDBC实现分库分表时,需要进行以下几个步骤: 1. 引入Sharding-JDBC的依赖:在项目的pom.xml文件中添加Sharding-JDBC的依赖。 2. 配置数据源:在项目的配置文件中配置数据源,包括主库和从库的连接信息。 3. 配置分库分表规则:在项目的配置文件中配置分库分表的规则,包括数据库的分片策略、表的分片策略以及分片键等。 4. 编写Mapper接口:在项目中编写Mapper接口,定义数据库的操作方法。 5. 编写Mapper.xml文件:在项目中编写Mapper.xml文件,配置SQL语句和参数映射。 6. 运行项目:启动项目,通过调用Mapper接口的方法来实现对数据库的操作。 通过以上步骤,就可以实现MyBatis分库分表功能。具体的实现细节可以参考引用\[1\]、\[2\]和\[3\]中的代码示例和配置文件。 \[1\]是新增的MyBatis查询接口的代码示例,\[2\]是MyBatis的配置文件示例,\[3\]是查询数据库的接口的代码示例。这些示例可以帮助你更好地理解和实现MyBatis分库分表功能。 #### 引用[.reference_title] - *1* [sharding-jdbc+mybatis分库分表实现查询二](https://blog.csdn.net/chengkui1990/article/details/116136312)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [sharding-jdbc+mybatis分库分表实现一](https://blog.csdn.net/chengkui1990/article/details/115872300)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值