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