首页 > 编程知识 正文

mybatis拦截器不生效,concat指定分隔符

时间:2023-05-03 21:06:39 阅读:16374 作者:1176

另一方面,在背景工作中,在一个项目下配置多个数据库,一个接口的业务查询的数据可能来自多个表,有时会遇到这些表分散在不同的数据库中的情况。 此时,可以通过Mybatis的拦截器在执行sql之前切换数据库。

注:项目是springboot项目,数据使用的是MySQL (Oracle未经测试)。

二、 2.1实现主启动的@ springbootapplicationpublicclassapplication { publicstaticconfigurableapplicationcontextapplicationconconteted string[]args )应用程序上下文=spring应用程序. run (application.class,args ); }在主启动类中,获取用于动态创建Bean的APP应用程序上下文。

2.2 mybatis拦截器import java.sql.Connection; @ intercepts ({ @ signature (type=executor.class,method='query ',args={MappedStatement.class,object.clase ) @signature(type=executor.class,method='query ',args={MappedStatement.class,obbass} ResultHandler.class ) @signature(type=executor.class,method=' update ' object.class } } @ componentpubliccclassmybatisinterceptorimplect @ overridepublicobjectintercept (invocation invocation ) throwsthrowable )映射语句=)映射语句com.CMB.PAM mng.pmg.manager.pmg manager.addpampmg是该mapper执行的数据库名称stringid=mapped statement.geent connection compmg getbean(sqlsessionfactory ).openSession ).getconnection if (id.starts with (com.CMB.PAM mng.' ) ) (字符串[ ] rered //切换数据源connection.set catalog (result [3] ); appLogger.info ('数据库切换为' result[3] )。 } else { connection.set catalog (db _ pmg ); //DB_PMG切换为默认数据名称appLogger.info ()数据库为) DB_PMG。 } return invocation.proceed (; } @ overridepublicobjectplugin (对象目标) if ) targetinstanceofexecutor (return plugin.wrap ) target,this ); } else { return target; } @ overridepublicvoidsetproperties (属性属性) { }} 2.3业务方法@ overridepublicpaymentgetpaymentbyid (longid ) )。 } Mybatis的拦截器技术可以通过查阅资料得知。 也许原理是,程序运行到一个mapper方法是被拦截器阻止的,拦截器修改其数据库连接,并在使用mapper方法实际运行时,正确地在目标库中运行

2.4事务问题同一事务包含多个数据库的crud操作,是否可以在单个事务中统一管理每个数据的操作?

事实上,为什么上述库剪切操作仍然可以在@Transactional注释中实现统一的事务管理?

在此,我推荐两个链接,介绍mybatis事务和spring-mybatis事务。

my batis:https://my batis.org/my batis-3/zh/getting-started.html

my batis-spring:http://my batis.org/spring/zh/transactions.html

通过上述链接,您可以了解mybatis事务管理的重要组件。 此外,mybatis-spring文档还包含以下语句:

看看窃听器的代码

连接连接=application.application context.get bean (sqlsessionfactory ).openSession ).getConnection很容易理解在此session下执行线程的所有操作,以便业务方法在处理多个库时提供统一的事务管理。

示例:

@ transactionalpublicintcreate (付款支付,订单订单) (订单日期.创建) ); //订单库returnpaymentdao.create (payment ); //付款库} 总之,想要保证所有操作能实现事务管理,就必须保证这些操作都是在同一session下完成的。

三、扩展表明,上述拦截器只对只进行单表操作的映射器方法起作用,而对多表操作的映射器方法可能出现问题。

如果mapper方法的sql语句太复杂,并且有多个表与查询相关联,这些表来自不同的库,该怎么办?

解决方案1 :在此sql语句中,不属于此库的所有表都必须使用前缀(数据库名.表名)。

解决方案2 :在此库中也创建这些表(但可能会导致数据分布混乱) )。

这两个方案根据情况而不同。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。