关系型DB(MySQL,MyBatis )

mybatis 动态数据源(mapper上自定义注解,实现关联查

2018-01-31  本文已影响0人  feiai

参考文章:https://blog.csdn.net/neosmith/article/details/61202084

gradle + spring + mybatis4

多源数据库配置好了,mybatis怎么 association 和 collection怎么跨库 查询呢?

我这里对上面的两种多源数据库配置,自己声明了mybatis拦截器进行 切库处理

参考文章中 

第一种 使用了 多个sqlsessionfactory,调用注入的不同的mapper的切换源

这种方式实现mybatis跨库 association 和 collection 查询,会直接报 mapper not found handle的错误,其实就是sqlsessionfactorybean找不到mapper,这里配置多个sqlsessionfactroy后,每个selsessionfactroybean都只会有自己扫描到的mapper,他是无法调用到其他sqlsessionfactroybean下的mapper的,这些mapper其debug代码时,他们都有自己的resultmap这么个东西,这个把xml的sql都用了个resultmap 对象返回,里面有configuration,就包含数据连接了的,哎,每个sqlsessionfactroy在初始化的时候都mapper的每条sql都声明好源了的,它执行association 时,也是在这个sqlsessionfactroybean中查找mapper,那么他那里找得到其他的sqlsessionfactroybean中的mapper。

那么第一种方法怎么解决这个问题,我们可以在拦截器中 将多个 sqlsessionfactroybean合成一个,这样它就找得到了,(我这里是实现了,这种方式有缺点,就是它不是注解,每声明个数据源,都要去拦截器中将 每个sqlsessionfactroybean中的mapper放到 @primary sqlsessionfactroybean 中)

第二种 注解方法+拦截器 可以很好的实现mybatis association 和 collection怎么跨库 查询

实现代码:根据参考文章,做出相应代码实现

大致代码如下

数据源配置 (这里只需要只配置一个sqlsessionfactroybean了)

加入拦截器

这是我的xml

这个是我的 mapper

接着我们要 遇到 @DS 注解就要切换数据源了

这是我的拦截器

到这里我们拦截器就写完了,然后我们可以 在mapper上 欢快的切花数据源了

接着来张效果图

上一篇下一篇

猜你喜欢

热点阅读