由于在接下来的项目中要用到多数据源,我负责这块的工作,所以查了一下资料,但是网上的资料还多都是千篇一律,抄袭过去,抄袭过来,所以自己试着成功了,希望对有需要的人帮助,如果有不正确的地方请扔砖头,经测试成功。话入正题。了解spring的大虾门肯定一看就知道这个原理,所以我就没有贴太多的注解了。如果有需要的可以留言交流
一、spring3.0.5,mybatis3.0.5、的包都不多说了,需要引入关于atomikos的包如下
 二、关于spring的applicationcontext的配置:
读取数据库的信息
- <!--属性文件读入,使用JdbcPlaceholderConfigurer则可以从数据库读取配置信息 -->
- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <list>
- <value>classpath*:jdbc.properties</value>
- </list>
- </property>
- </bean>
jdbc.properties的配置文件
- jdbc.username=root
- jdbc.password=123456
- jdbc.url=jdbc:mysql://192.168.1.8:3310/sitestone?useUnicode=true&characterEncoding=utf-8
- jdbc.driver=com.mysql.jdbc.Driver
- jdbca.url=jdbc:mysql://192.168.1.8:3310/sitesttwo?useUnicode=true&characterEncoding=utf-8
- jdbca.username=root
- jdbca.password=123456
- jdbca.driver=com.mysql.jdbc.Driver
配置mysql的两个数据源
- <!-- 两个数据源的功用配置,方便下面直接引用 -->
- <bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
- destroy-method="close" abstract="true">
- <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
- <property name="poolSize" value="10" />
- <property name="minPoolSize" value="10"/>
- <property name="maxPoolSize" value="30"/>
- <property name="borrowConnectionTimeout" value="60"/>
- <property name="reapTimeout" value="20"/>
- <!-- 最大空闲时间 -->
- <property name="maxIdleTime" value="60"/>
- <property name="maintenanceInterval" value="60 />
- <property name="loginTimeout" value="60"/>
- <property name="logWriter" value="60"/>
- <property name="testQuery">
- <value>select 1</value>
- </property>
-
- </bean>
- <!-- 配置第一个数据源 -->
- <bean id="dataSource" parent="abstractXADataSource">
- <!-- value只要两个数据源不同就行,随便取名 -->
- <property name="uniqueResourceName" value="mysql/sitestone" />
- <property name="xaDataSourceClassName"
- value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
- <property name="xaProperties">
- <props>
- <prop key="URL">${jdbc.url}</prop>
- <prop key="user">${jdbc.username}</prop>
- <prop key="password">${jdbc.password}</prop>
- </props>
- </property>
- </bean>
- <!-- 配置第二个数据源-->
- <bean id="dataSourceB" parent="abstractXADataSource">
- <!-- value只要两个数据源不同就行,随便取名 -->
- <property name="uniqueResourceName" value="mysql/sitesttwo" />
- <property name="xaDataSourceClassName"
- value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
- <property name="xaProperties">
- <props>
- <prop key="URL">${jdbca.url}</prop>
- <prop key="user">${jdbca.username}</prop>
- <prop key="password">${jdbca.password}</prop>
- </props>
- </property>
- </bean>
配置sessionfactory
- <!-- 配置mybatis的SessionFactory -->
- <bean id="sqlSessionFactoryB" class="org.mybatis.spring.SqlSessionFactoryBean">
- <!--mybatis的总配置文件-->
- <property name="configLocation" value="classpath:configurationb.xml"/>
- <!--扫描mybatis的写sql的mapper文件-->
- <property name="mapperLocations" value="classpath*:/com/suntel/linkup/model/mappert/*Mapper.xml"/>
- <!----选择数据源------>
- <property name="dataSource" ref="dataSourceB" />
- </bean>
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="configLocation" value="classpath:configuration.xml"/>
- <property name="mapperLocations" value="classpath*:/com/suntel/linkup/model/mapper/*Mapper.xml"/>
- <property name="dataSource" ref="dataSource" />
- </bean>
为dao中选择相应的SqlSessionTemplate,给sqlsession注入相应的session工厂,这样dao和有相应的数据库可以连接了
- <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactory" />
- </bean>
- <bean id="sqlSessionb" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactoryB" />
- </bean>
举例说下关于dao的调用,注意下划线的地方;
- private SqlSession sqlSessionb;
-
- public T create(String sql_ID,T entity) {
- this.getSqlSessionb().insert(sql_ID, entity);
- return entity;
- }
- public SqlSession getSqlSessionb() {
- return sqlSessionb;
- }
- public void setSqlSessionb(SqlSession sqlSessionb) {
- this.sqlSessionb = sqlSessionb;
- }
- 这儿得sqlSessionb是和spring配置文件中的
- <bean id="sqlSessionb" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactoryB" />
- </bean> 相对用的,名称和bean中的id要相同,
- 调用另一个数据session也是一样的原理:private SqlSession sqlSession;
- public SqlSession getSqlSession() {
return sqlSession; }
public void setSqlSession(SqlSession sqlSession) { this.sqlSession = sqlSession; }
- <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactory" />
- </bean>
配置事务
- <!-- 事务这块用spring管理atomikos -->
- <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
- init-method="init" destroy-method="close">
- <property name="forceShutdown">
- <value>true</value>
- </property>
- </bean>
- <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
- <property name="transactionTimeout" value="300" />
- </bean>
- <bean id="springTransactionManager"
- class="org.springframework.transaction.jta.JtaTransactionManager">
- <property name="transactionManager">
- <ref bean="atomikosTransactionManager" />
- </property>
- <property name="userTransaction">
- <ref bean="atomikosUserTransaction" />
- </property>
- <!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default -->
- <property name="allowCustomIsolationLevels" value="true"/>
-
- </bean>
- <!-- 支持 @AspectJ 标记-->
- <aop:aspectj-autoproxy />
-
-
- <!-- 以AspectJ方式 定义 AOP -->
- <aop:config proxy-target-class="true">
- <aop:advisor pointcut="execution(* com.suntel.linkup.service..*.*(..))" advice-ref="txAdvice"/>
- </aop:config>
-
- <!-- 配置事务传播特性:如果存在一个事务,则支持当前事务。如果没有事务则开启:REQUIRED -->
- <tx:advice id="txAdvice" transaction-manager="springTransactionManager">
- <tx:attributes>
- <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
- <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
- <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
- <tx:method name="create*" propagation="REQUIRED" rollback-for="Exception"/>
- <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
- <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
- <tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception"/>
- <tx:method name="*" read-only="true"/>
- </tx:attributes>
- </tx:advice>
好了,代码贴完了,可以试着运行了。
|