废话不多说,关键代码如下所示:
1. 代码: DbContextHolder
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class DbContextHolder { //线程安全的ThreadLocal private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return ((String)contextHolder.get()); } public static void clearDbType() { contextHolder.remove(); } } |
2. 代码 : DynamicDataSource
1
2
3
4
5
6
7
|
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override public Object determineCurrentLookupKey() { return DbContextHolder.getDbType(); } } |
3.代码: spring.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<!-- 数据源属性配置文件 --> <context:property-placeholder location= "classpath:ibatis.properties" /> <bean id= "jksh" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method= "close" > <!-- Connection Info --> <property name= "driverClassName" value= "${driver.jksh}" /> <property name= "url" value= "${url.jksh}" /> <property name= "username" value= "${username.jksh}" /> <property name= "password" value= "${password.jksh}" /> <!-- Connection Pooling Info --> <property name= "maxIdle" value= "${maxIdle.jksh}" /> <property name= "maxActive" value= "${maxActive.jksh}" /> <property name= "defaultAutoCommit" value= "false" /> <property name= "timeBetweenEvictionRunsMillis" value= "${timeBetweenEvictionRunsMillis.jksh}" /> <property name= "minEvictableIdleTimeMillis" value= "${minEvictableIdleTimeMillis.jksh}" /> </bean> <bean id= "jclt" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method= "close" > <!-- Connection Info --> <property name= "driverClassName" value= "${driver.jclt}" /> <property name= "url" value= "${url.jclt}" /> <property name= "username" value= "${username.jclt}" /> <property name= "password" value= "${password.jclt}" /> <!-- Connection Pooling Info --> <property name= "maxIdle" value= "${maxIdle.jclt}" /> <property name= "maxActive" value= "${maxActive.jclt}" /> <property name= "defaultAutoCommit" value= "false" /> <property name= "timeBetweenEvictionRunsMillis" value= "${timeBetweenEvictionRunsMillis.jclt}" /> <property name= "minEvictableIdleTimeMillis" value= "${minEvictableIdleTimeMillis.jclt}" /> </bean> <bean id= "dataSource" class = "com.jclt.service.commons.DynamicDataSource" > <property name= "targetDataSources" > <map key-type= "java.lang.String" > <entry key= "jksh" value-ref= "jksh" /> <entry key= "jclt" value-ref= "jclt" /> </map> </property> <property name= "defaultTargetDataSource" ref= "jksh" /> </bean> |
4. 代码:main方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import com.jclt.service.commons.DbContextHolder; import com.jclt.service.model.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; public class Text { /** * @param args */ public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext( "client-beans.xml" ); DbContextHolder.setDbType( "jclt" ); String res= "src/main/resources/ibatis-config.xml" ; DataSource datasource=(DataSource) appContext.getBean( "dataSource" ); SqlSessionFactoryBean bean= new SqlSessionFactoryBean(); bean.setDataSource(datasource); Resource resource= new FileSystemResource(res); bean.setConfigLocation(resource); try { SqlSessionFactory sessionfactory = bean.getObject(); SqlSession session=sessionfactory.openSession(); User user=session.selectOne( "com.jclt.service.Dao.readJKSH.findOne" ); System.out.println(user.getName()); } catch (Exception e) { e.printStackTrace(); } DbContextHolder.setDbType( "jksh" ); String res1= "src/main/resources/ibatis-config.xml" ; DataSource datasource1=(DataSource) appContext.getBean( "dataSource" ); SqlSessionFactoryBean bean1= new SqlSessionFactoryBean(); bean1.setDataSource(datasource1); Resource resource1= new FileSystemResource(res1); bean1.setConfigLocation(resource1); try { SqlSessionFactory sessionfactory = bean.getObject(); SqlSession session=sessionfactory.openSession(); User user=session.selectOne( "com.jclt.service.Dao.readJKSH.findOne" ); System.out.println(user.getName()); } catch (Exception e) { e.printStackTrace(); } } } |
以上所述是小编给大家介绍的Spring与Mybatis相结合实现多数据源切换功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!