SPRING IBATIS 多数据源

来源:互联网 发布:沈阳工业大学知乎 编辑:程序博客网 时间:2024/05/21 17:02

这里用的是比较原始的办法。笨办法。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:p="http://www.springframework.org/schema/p"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:tx="http://www.springframework.org/schema/tx"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"    default-autowire="byName"><!--   ====================    ======================== =====================-->    <bean id="dataSourceAcc" class="org.springframework.jndi.JndiObjectFactoryBean">            <property name="jndiName" value="java:comp/env/jdbc/accor"></property> </bean>     <bean id="sqlMapClientAcc" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">        <property name="configLocation" value="classpath:config/SqlMapConfig.xml">        </property>        <property name="dataSource" ref="dataSourceAcc"></property>    </bean>    <bean id="transactionManagerAcc" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" scope="prototype">        <property name="dataSource"><ref local="dataSourceAcc"/></property>    </bean><!--   ====================    ======================== =====================-->    <bean id="dataSourceUatAcc" class="org.springframework.jndi.JndiObjectFactoryBean">            <property name="jndiName" value="java:comp/env/jdbc/uatacc"></property> </bean>     <bean id="sqlMapClientUatAcc" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">        <property name="configLocation" value="classpath:config/SqlMapConfig.xml">        </property>        <property name="dataSource" ref="dataSourceUatAcc"></property>    </bean>    <bean id="transactionManagerUatAcc" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" scope="prototype">        <property name="dataSource"><ref local="dataSourceUatAcc"/></property>    </bean>        <!--   ====================    ======================== =====================-->        <bean class="dao.impl.TestUserDAOImpl" id="testUserDAO" scope="prototype">    <property name="sqlMapClient" ref="sqlMapClientAcc"></property>    <property name="sqlMapClientAcc" ref="sqlMapClientAcc"></property>    <property name="sqlMapClientUatAcc" ref="sqlMapClientUatAcc"></property>    </bean>    <bean id="multyDataSourceTestService" class="service.impl.MultyDataSourceTestServiceImpl" scope="prototype"><property name="testUserDAO" ref="testUserDAO"></property>    <property name="transactionManagerAcc" ref="transactionManagerAcc"></property>    <property name="transactionManagerUatAcc" ref="transactionManagerUatAcc"></property></bean>    <bean id="multyDataSourceTestAction" class="action.MultyDataSourceTestAction" scope="prototype">    <property name="multyDataSourceTestService" ref="multyDataSourceTestService"></property>    </bean>    </beans>

这里三处要配置成双份的:DataSource/SqlMapClient/TransactionManager

SQLMAP文件我只用了一份,公用

这里的sqlMapClient一定要设置,或者default-autowire="byName",我这里是重复了,重复没关系

package service.impl;import java.util.ArrayList;import java.util.List;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.TransactionDefinition;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.support.DefaultTransactionDefinition;import model.TestUser;import dao.TestUserDAO;import service.MultyDataSourceTestService;public class MultyDataSourceTestServiceImpl implements MultyDataSourceTestService{private TestUserDAO testUserDAO;private DataSourceTransactionManager transactionManagerAcc;private DataSourceTransactionManager transactionManagerUatAcc;public void setTransactionManagerAcc(DataSourceTransactionManager transactionManagerAcc) {this.transactionManagerAcc = transactionManagerAcc;}public void setTransactionManagerUatAcc(DataSourceTransactionManager transactionManagerUatAcc) {this.transactionManagerUatAcc = transactionManagerUatAcc;}public void setTestUserDAO(TestUserDAO testUserDAO) {this.testUserDAO = testUserDAO;}public List<TestUser> findUsers(Integer id) throws Exception {List<TestUser> users = new ArrayList<TestUser>();users = testUserDAO.selectAccUsers(id);System.out.println(users);DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status = transactionManagerUatAcc.getTransaction(def);TransactionStatus status2 = transactionManagerAcc.getTransaction(def);try{System.out.println(testUserDAO.updateAccUsers());if(true)throw new RuntimeException();System.out.println(testUserDAO.updateAccUsers2());transactionManagerUatAcc.commit(status);}catch (Exception e) {e.printStackTrace();transactionManagerUatAcc.rollback(status);}return users;}}

这里TransactionStatus和DefaultTransactionDefinition用来开启事务,如果是SELECT可以直接DAO,需要使用事务的时候才有必要用到这些。

这个比起在SPRING配置文件里面配置事务各有优缺点,适合用于嵌套事务。

package dao.impl;import java.util.List;import model.TestUser;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;import com.ibatis.sqlmap.client.SqlMapClient;import dao.TestUserDAO;public class TestUserDAOImpl extends SqlMapClientDaoSupport implements TestUserDAO{private SqlMapClient sqlMapClientAcc;private SqlMapClient sqlMapClientUatAcc;public void setSqlMapClientAcc(SqlMapClient sqlMapClientAcc) {this.sqlMapClientAcc = sqlMapClientAcc;}public void setSqlMapClientUatAcc(SqlMapClient sqlMapClientUatAcc) {this.sqlMapClientUatAcc = sqlMapClientUatAcc;}@SuppressWarnings("unchecked")public List<TestUser> selectAccUsers(Integer id) throws Exception {super.setSqlMapClient(sqlMapClientAcc);return (List<TestUser>)getSqlMapClientTemplate().queryForList("selectUsers");}@SuppressWarnings("unchecked")public List<TestUser> selectUatAccUsers(Integer id) throws Exception {super.setSqlMapClient(sqlMapClientUatAcc);return (List<TestUser>)getSqlMapClientTemplate().queryForList("selectUsers");}public Integer updateAccUsers() throws Exception {super.setSqlMapClient(sqlMapClientAcc);return getSqlMapClientTemplate().update("updateUsers");}public Integer updateUatAccUsers() throws Exception {super.setSqlMapClient(sqlMapClientUatAcc);return getSqlMapClientTemplate().update("updateUsers");}public Integer updateAccUsers2() throws Exception {super.setSqlMapClient(sqlMapClientAcc);return getSqlMapClientTemplate().update("updateUsers2");}public Integer updateUatAccUsers2() throws Exception {super.setSqlMapClient(sqlMapClientUatAcc);return getSqlMapClientTemplate().update("updateUsers2");}}

这里定义了两个sqlMapClient,由spring配置文件实例化,super.setSqlMapClient设置template模板