任务:实现mySQL的两个数据库SecondClass和SecondClass2的操作,从第一个数据库的一张表中拿到一个字段信息添加到第二个数据库的一张表中。
1.将数据库链接信息放在jdbc.priperties文件中,主要配置项为:
(数据库别名).jdbc.diverClassName
(数据库别名).url
(数据库别名).username
(数据库别名).password
通过不同的数据库别名来区分数据库。例:hikaricp、hikaricp2
2.将数据库配置引入配置文件。
在spring-mybatis.xml文件中加入这个bean配置
1. <bean id="propertyConfigurer"
2. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
3. <property name="location" value="classpath:jdbc.properties" />
4. </bean>
标红部分说明从当前文件同一文件夹下的jdbc.properties文件中读取信息。
3.数据库信息配置。
1. <bean id="hikariDataSource" class="com.zaxxer.hikari.HikariDataSource"
2. destroy-method="close">
3. <constructor-arg>
4. <bean class="com.zaxxer.hikari.HikariConfig">
5. <property name="driverClassName" value="${hikaricp.jdbc.driverClassName}" />
6. <property name="jdbcUrl" value="${hikaricp.url}" />
7. <property name="username" value="${hikaricp.username}" />
8. <property name="password" value="${hikaricp.password}" />
9. <property name="connectionTestQuery" value="${hikaricp.connectionTestQuery}" />
10. <property name="connectionTimeout" value="${hikaricp.connectionTimeout}" />
11. <property name="idleTimeout" value="${hikaricp.idleTimeout}" />
12. <property name="maxLifetime" value="${hikaricp.maxLifetime}" />
13. <property name="maximumPoolSize" value="${hikaricp.maximumPoolSize}" />
14. <property name="minimumIdle" value="${hikaricp.minimumIdle}" />
15. <property name="autoCommit" value="false" />
16. </bean>
17. </constructor-arg>
18. </bean>
标黄部分是这个bean的id号,通过这个id号来区别多数据源的配置。
标红部分就对应前面在jdbc.properties文件中配置的数据库信息。
4.配置切换数据库自定义类
1. <bean id="multipleDataSource"
2. class="com.buptyouth.mybatis.util.MultipleDataSource">
3. <property name="defaultTargetDataSource" ref="hikariDataSource"></property>
4. <property name="targetDataSources">
5. <map>
6. <entry key="hikariDataSource" value-ref="hikariDataSource"></entry>
7. <entry key="hikari2DataSource" value-ref="hikari2DataSource"></entry>
8. </map>
9. </property>
10. </bean>
标黄部分就是我们自定义的切换类的包路径。
标红部分是我们配置好的bean的id号。ref是引用的意思。
5.数据库连接池配置
1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
2. <!--dataSource属性指定要用到的连接池 -->
3. <property name="dataSource" ref="multipleDataSource" />
4. <!-- 所有配置的mapper文件 -->
5. <property name="mapperLocations"
6. value="classpath:com/buptyouth/mybatis/xmlmapper/*.xml" />
7. </bean>
标红部分设置为我们配置的切换数据库自定义类
6.事物配置
1. <!-- 声明式事务管理 -->
2. <bean id="transactionManager"
3. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
4. <property name="dataSource" ref="multipleDataSource" />
5. </bean>
标红部分设置为我们配置的切换数据库自定义类
7.generatorConfig.xml配置
<generatorConfiguration> <context id="MybatisLearn" targetRuntime="MyBatis3" defaultModelType="flat">
…
</context> <context id="MybatisLearn2"targetRuntime="MyBatis3" defaultModelType="flat">
…
</context> </generatorConfiguration>
省略号中间配置为原来的信息,需改<table>信息与数据库表相对应,红色字体为识别两个context的唯一id需要修改。
二.数据库切换类
按照我们前面配置的类路径com.buptyouth.mybatis.util下新建MultipleDataSource类和DataSourceHolder
(当然,类的路径和名称都可以修改,只要保证配置正确就行),
MultipleDataSource代码如下:
package com.buptyouth.mybatis.util; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class MultipleDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceHolder.getDataSources(); } }
DataSourceHolder代码:
package com.buptyouth.mybatis.util; public class DataSourceHolder { private static final ThreadLocal<String> dataSources = new ThreadLocal<String>(); public static void setDataSources(String dataSource) { dataSources.set(dataSource); } public static String getDataSources() { return dataSources.get(); } }
三.多数据源使用
一般是在操作数据库前进行切换的,只需在数据库操作前加上如下代码即可:
DataSourceHolder.setDataSources("hikariDataSource");
String datasource= DataSourceHolder.getDataSources();
或
DataSourceHolder.setDataSources("hikari2DataSource"); String datasource2= DataSourceHolder.getDataSources();