如何用Mybatis分库分表

分库

在分库的时候 有时候为了方便 一些表需要存放所有库的信息,称为全局库。如:用户表存放所有的用户。

此时分库的思路 数据库分为全局库和业务库,其中业务库又分为N多个库,全局库只放个别表方便开发。

这个时候 就需要一个全局DAO,此时我们的Mybatis就需要支持两个DAO

两个DAO(bizDao和globalDao)就需要有两个sqlSessionFactory,bizSqlSessionFactory和globalSqlSessionFactory和两个事物管理器transactionManager

    <bean id="bizDao" class="com.xxx.dao.BizDao"><property name="sqlSessionFactory" ref="bizSqlSessionFactory"/></bean><bean id="globalDao" class="com.xxx.dao.GlobalDao"><property name="sqlSessionFactory" ref="globalSqlSessionFactory"/></bean>
     <bean id="bizSqlSessionFactory" parent="sqlSessionFactoryDefault" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="routingDataSource"/> </bean><bean id="globalSqlSessionFactory" parent="sqlSessionFactoryDefault" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="globalDataSource"/>           </bean>

根据请求动态指定业务库DataSource

分库就是一个项目有多个数据库,对Myabtis来说就有多个数据源(dataSource)根据你的请求 判断应该查询哪个库 从而指定动态指定哪个数据源

可以继承Spring的AbstractRoutingDataSource重写接口中determineCurrentLookupKey()根据业务需求返回当前的dbkey(哪个库1、2、3、4。。。)

全局库和业务库事物管理器

因为事物是基于Service的,所以Service也建议分为全局Service和业务Service,根据Service类型(建议配个AOP全局处理 放到ThreadLocal中)

实现PlatformTransactionManager接口,接口中getTransaction()方法可以动态的返回指定的事物管理器(从上面的ThreadLocal中拿到当前的事物管理器)

思考:为什么AbstractRoutingDataSource中多个DataSource不需要动态配置事物管理器?

总结:业务库和全局库有两个不同的DataSource,其中业务库的DataSource继承Spring的AbstractRoutingDataSource

Spring又分为了N个DataSource(对bizSqlSessionFactory而言 只有一个RoutingDataSource,RoutingDataSource里面有一个数据源集合)

全局的globalSqlSessionFactory也可以当bizSqlSessionFactory中的AbstractRoutingDataSource的一个属性 这么做虽然减少了配置,但是开发不直观。

分表

上面的分库的思路就是动态指定DateSource和TransactionManager

分表:就是在Mybatis中写一个拦截器 动态的更改表名

1.拦截器

SqlSessionFactoryBean里面有个private Interceptor[] plugins;属性 可以配置一些拦截器

我们自己定义的拦截器需要实现Interceptor接口

接口需要加以下注解

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

2.在拦截器里面 我们需要动态解析SQL和更改SQL

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})
})
public class MybatisInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {if (invocation.getTarget() instanceof StatementHandler) {RoutingStatementHandler handler = (RoutingStatementHandler) invocation.getTarget();//通过反射拿到statement对象StatementHandler delegate = (StatementHandler) ReflectUtil.getFieldValue(handler, "delegate");BoundSql boundSql = delegate.getBoundSql();String sql = boundSql.getSql();String pageSql =sql+" limit 1 ";//操作sql//再通过反射把新sql设置进去ReflectUtil.setFieldValue(boundSql, "sql", pageSql);}return invocation.proceed();}

Mybatis四大对象以及插件原理

转载于:https://www.cnblogs.com/ssskkk/p/11109597.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes权威指南精彩段落

2019独角兽企业重金招聘Python工程师标准>>> 看到上述两段代码&#xff0c;你可能会有一种“开门复动竹, 疑是故人来”的感觉。的确&#xff0c;这段代码经笔者反复考证后认定&#xff1a;100%高仿kubernetes Controller Server中的代码。连传说中的谷歌大神也能cop…

常用文献管理软件使用经验

常用的文献管理软件有&#xff1a;Endnote、Biblioscape和Reference Manager。由于不知道哪个好用&#xff0c;我把三个都装上进行了对比。 一、首先是在Word中引用文献功能的比较。 Endnote是最方便的&#xff0c;工具条上的按键就可以把文献插入到Word中。Biblioscape也能与W…

IMP出现的ORA-01401错误可能和字符集有关(转载)

今天在论坛上&#xff0c;看到有一位朋友问 “我备份数据库后在其他的机器上再导入这个数据库&#xff0c;出现如下错误&#xff0c;并只能导 入部分数据。 IMP-00019: row rejected due to ORACLE error 1401 IMP-00003: ORACLE error 1401 encountered ORA-01401: inserted v…

QT中的pro文件

动态库pro设置VERSION 1.0.1901.0时&#xff0c;产生目标名字总会带数字1解决方法&#xff1a;CONFIG skip_target_version_ext设置输出路径 DESTDIR ./output静态链接 LIBS -L$$PWD/../../lib -lopencv_world320转载于:https://www.cnblogs.com/huanyinglvtuan/p/11280013…

大数据——SparkSQL学习笔记

Spark 一、SparkSQL简介 ​ Spark用来处理结构化数据的一个模块&#xff0c;它提供了两个编程抽象分别叫做DataFrame和DataSet&#xff0c;它们用于作为分布式SQL查询引擎&#xff08;类似于Hive&#xff0c;为便于进行MapReduce操作而使用类SQL语句进行Spark操作&#xff09…

windows phone7资料整理

wp7资料库 http://msdn.microsoft.com/zh-cn/magazine/gg598932.aspx 开发指导视频&#xff1a; http://channel9.msdn.com/Series/Windows-Phone-7-Development-for-Absolute-Beginners 指导博客&#xff1a; http://www.jeffblankenburg.com/2010/09/30/31-days-of-windows-p…

远程连接 SuSE Linux 设置方法

作者&#xff1a;Flyingis 且不说远程连接的便利性&#xff0c;就是机房里那轰轰的高分贝就足以让你的耳膜形成习惯性振动&#xff0c;何况还需要集中精神工作呢&#xff0c;在网络带宽允许的情况下&#xff0c;还是选择远程吧。远程连接的客户端工具有很多&#xff0c;有商…

android获取控件宽度高度

前几天&#xff0c;在自定义控件的时候碰到个问题&#xff0c;就是在如何获取自定义控件的高宽。在自定义控件类的构造函数中&#xff0c;本来以为可以轻松获取&#xff0c;但事实不是这样。我测试了下面代码&#xff1a; 先是布局代码&#xff1a; <com.lml.getvalues.MyVi…

浅谈Java网络编程之Socket (1)

和大家一起分享的是Java网络编程之Socket。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象&#xff0c;这个对象有两个关键的方法&#xff0c;一个是getInputStream方法&#xff0c;另一个是getOutputStream方法。getInputStream方法可以得到一个输入流&#xff…

Windows10系统Python2.7通过Swig调用C++过程

我用的 python版本是2.7.12&#xff1a; Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32 1, 下载Swig 下载地址&#xff1a;http://www.swig.org/download.html&#xff0c;我下载了最新版本swigwin-4.0.0. 下载后直接解压…

《当程序员的那些狗日日子》(六十一)美丽的天际

《当程序员的那些狗日日子》&#xff08;六十一&#xff09;美丽的天际 注&#xff1a;这一篇之后&#xff0c;全文完结&#xff0c;后面还会再写一篇《后记》&#xff0c;以记录我在写作中的一些心情和感受&#xff0c;以及我想对各位支持和关注的朋友说的话。 我交了订金订购…

ewebeditor遍历路径漏洞

ewebeditor/admin_uploadfile.asp?id14在id14后面添加&dir..再加 &dir../..&dirhttp://www.cnblogs.com/../.. 看到整个网站文件了 转载于:https://www.cnblogs.com/allyesno/archive/2007/11/04/949171.html

Windows系统Python直接调用C++ DLL

环境&#xff1a;Window 10&#xff0c;VS 2019&#xff0c; Python 2.7.12, 64bit 1&#xff0c;打开 VS 2019&#xff0c;新建C Windows 动态链接库工程 Example&#xff0c;加入下列文件&#xff0c;如果Python是64位的则在VS中 Solution platforms 选择 x64 编译成64位的 D…

用SD卡下载uboot、linux内核和文件系统

1、 移植mtd-utils: a) 下载utd-utils 下载地址为ftp://ftp.infradead.org/pub/mtd-utils/b) 交叉编译mtd-utilsi 修改Makefile CROSSarm-linux-ii makeiii 查看下mtd-utils-1.0.0目录下是否生成了咱们所需要大工具 (flashcp,nandwrite......等)。有工具生成了&#xf…

进行有效编辑的七种习惯

如果你的很多时间是用来敲纯文本&#xff0c;写程序或HTML&#xff0c;那么有效地使用一个好的编辑器能节省你不少时间。这篇文章里的指导和提示将有助于你更快工作&#xff0c;更少犯错误。 文中采用开源文本编辑器Vim(Vi IMproved)说明有效编辑的思想&#xff0c;但这些思想也…

最全的HTML特殊字符集

有些属于utf-8字符集&#xff0c;所以网页需要字符编码是utf-8才能显示全部字符。下面是来自不同的源&#xff0c;所以难免有重复的地方。 left single quote &lsquo;‘right single quote &rsquo;’single low-9 quote &sbquo;‚left double quote &ldquo;“r…

Desktop OS Market Share: Windows 90% - Mac 9% - Linux 1%

http://blog.tangcs.com/2008/12/14/desktop-os-market-share-2008/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/12/14/1354704.html

css3中变形与动画(三)

transform可以实现矩阵变换&#xff0c;transition实现属性的平滑过渡&#xff0c;animation意思是动画&#xff0c;动漫&#xff0c;这个属性才和真正意义的一帧一帧的动画相关。本文就介绍animation属性。 animation属性通过一些关键帧中元素属性的改变来实现动画效果。当然也…

Lock“锁定”语句(C# 参考)

lock 关键字将语句块标记为临界区&#xff0c;方法是获取给定对象的互斥锁&#xff0c;执行语句&#xff0c;然后释放该锁。此语句的形式如下&#xff1a; 以带有颜色区分的格式查看复制到剪贴板打印Object thisLock new Object(); lock (thisLock) {// Critical code section…

个人代码库の自定义后缀名

usingMicrosoft.Win32; //操纵注册表的必要命名空间。namespacemyMethod{publicclassCreateSuffixName {//使程序获取被双击了的文件的路径,用到[Command]函数&#xff0c;可以[获取路径].///<summary>///创建自定义后缀名的方法。///</summary>///<param name&…