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语句那里特意不需要处理该字段,完美解决问题。