mybatis 动态数据源(mapper上自定义注解,实现关联查
参考文章: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上 欢快的切花数据源了
接着来张效果图