MyBatis连接多数据库的经验总结

1. 前言

最近博主在学习Spring的相关知识,数据库操作用到MyBatis框架 + MySQL。其中涉及到了多数据库连接的问题,坑了博主不少时间,所以还是记录一下经验。

1.1 业务场景

业务项目已经配置过了 MySql数据库A,暂且命名为 MySql_DBA。

项目数据库暂且配置如下:

<!-- 以下是连接 数据库A 配置 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.wty.api.**.**.repository" />
		<property name="sqlSessionFactoryBeanName" value="myBatisSqlSessionFactory" />
		<property name="annotationClass" value="org.springframework.stereotype.Repository" />
	</bean>

	<bean id="myBatisSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dbA" />
		<property name="mapperLocations" value="classpath*:mapper/*Mapper.xml" />
	</bean>

这里主要注意:

  • mapperLocations:mapper xml文件目录
  • sqlSessionFactoryBeanName
  • basePackage (扫描Mapper的repository接口)

2.加入数据库B的需求,并且操作数据库B中的某一张表 —— org.apache.ibatis.binding.BindingException:Invalid bound statement

博主直接在xml文件上拷贝一份数据库A的配置,然后重命名为数据库B

<!-- 以下是连接 数据库A 配置 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.wty.api.**.**.repository" />
		<property name="sqlSessionFactoryBeanName" value="myBatisSqlSessionFactory1" />
		<property name="annotationClass" value="org.springframework.stereotype.Repository" />
	</bean>

	<bean id="myBatisSqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dbA" />
		<property name="mapperLocations" value="classpath*:mapper/*Mapper.xml" />
	</bean>

<!-- 以下是连接 数据库B 配置 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.wty.api.**.**.repository" />
		<property name="sqlSessionFactoryBeanName" value="myBatisSqlSessionFactory2" />
		<property name="annotationClass" value="org.springframework.stereotype.Repository" />
	</bean>

	<bean id="myBatisSqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dbB" />
		<property name="mapperLocations" value="classpath*:mapper/*Mapper.xml" />
	</bean>

然后把其他所有对应的文件都拷贝到跟数据库A一样的目录。
那么,直接gg了。

错误提示:

  • 运行代码的时候,直接提示找不到映射文件
    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

既然这样,我就干脆每个数据库都独立的包路径,避免冲突。
配置文件改成下面这样:

<!-- 以下是连接 数据库A 配置 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.wty.api.**.**.repositoryA" />
		<property name="sqlSessionFactoryBeanName" value="myBatisSqlSessionFactory1" />
		<property name="annotationClass" value="org.springframework.stereotype.Repository" />
	</bean>

	<bean id="myBatisSqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dbA" />
		<property name="mapperLocations" value="classpath*:mapper/xxxA/*Mapper.xml" />
	</bean>

<!-- 以下是连接 数据库B 配置 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.wty.api.**.**.repositoryB" />
		<property name="sqlSessionFactoryBeanName" value="myBatisSqlSessionFactory2" />
		<property name="annotationClass" value="org.springframework.stereotype.Repository" />
	</bean>

	<bean id="myBatisSqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dbB" />
		<property name="mapperLocations" value="classpath*:mapper/xxxB/*Mapper.xml" />
	</bean>

注意:

  • 改完之后记得mapper文件里面的namespace也要对应修改

3. 操作数据库B时出现了错误 —— java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp

原因是数据库中的某一个字段执行的时候发现时间格式是 0000-00-00 00:00:00

所以,博主由于不需要这个字段,为了业务正常运行,在sql语句那里特意不需要处理该字段,完美解决问题。

单片机菜鸟哥 CSDN认证博客专家 Java ESP8266
1、多年Android App开发经验;
2、小程序流行期加入了小程序开发大军;
3、业余时间爱捣鼓自己的业余爱好,对ESP8266物联网开发有自己的见解;
4、喜欢研究代码规范,喜欢了解新知识,致力于不甘做个平凡程序员,知其原理,懂其核心。
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值