Spring3.2.8+Mybatis3.2.6 多数据源基于BaseDAO的配置
配置数据源为:
MySQL5.5.6
H2Database 1.3.75
这个配置起来比较麻烦,本文这种方法有点麻烦,就是dao不能再用注解了,但是程序简单。还有别的方法,后续放出。
spring-core.xml
<?xml version="1.0" encoding="UTF-8"?> <beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"> <context:annotation-config/> <context:property-placeholder location="classpath*:framework/jdbc.properties"/> <!-- 配置系统的数据源 --> <bean id="dataSourceMySQL" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/qhtf"/> <property name="username" value="root"/> <property name="password" value="leizm"/> <property name="filters" value="stat"/> <property name="maxActive" value="10"/> <property name="initialSize" value="1"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="1"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="50"/> <property name="maxOpenPreparedStatements" value="100"/> </bean> <bean id="sqlSessionFactoryMySQL" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:framework/mybatis-config.xml"/> <property name="mapperLocations" value="classpath:/com/lavasoft/aac/entity/sqlmap/*.xml"/> <property name="dataSource" ref="dataSourceMySQL"/> </bean> <bean id="sqlSessionTemplateMySQL" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactoryMySQL"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplateMySQL"/> <property name="basePackage" value="com.lavasoft.aac.dao"/> </bean> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSourceMySQL"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="select*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="load*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="query*" read-only="true"/> <tx:method name="count*" read-only="true"/> <tx:method name="read*" read-only="true"/> <tx:method name="sync*"/> <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="executeService" expression="execution(* com.lavasoft.aac.service.*SVImpl.*(..))"/> <aop:advisor pointcut-ref="executeService" advice-ref="txAdvice"/> </aop:config> <!-- ================================H2================================== --> <!--H2内存数据库配置--> <bean id="dataSourceH2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="org.h2.Driver"/> <property name="url" value="jdbc:h2:mem:/memdb;DB_CLOSE_DELAY=-1"/> <property name="username" value="sa"/> <property name="password" value=""/> <property name="filters" value="stat"/> <property name="maxActive" value="10"/> <property name="initialSize" value="1"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="1"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="50"/> <property name="maxOpenPreparedStatements" value="100"/> </bean> <bean id="sqlSessionFactoryH2" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:framework/h2SqlMapConfig.xml"/> <property name="mapperLocations" value="classpath:/com/lavasoft/aac/entity/sqlmap/*.xml"/> <property name="dataSource" ref="dataSourceH2"/> </bean> <bean id="sqlSessionTemplateH2" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactoryH2"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryH2"/> <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplateH2"/> <property name="basePackage" value="com.lavasoft.aac.daoh2"/> </bean> <bean id="baseDAO" class="com.lavasoft.framework.core.BaseMybatisDAO" abstract="true"> <property name="sqlSessionFactory" ref="sqlSessionFactoryH2"/> <property name="sqlSessionTemplate" ref="sqlSessionTemplateH2"/> </bean> <bean id="transactionManagerH2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSourceH2"/> </bean> <tx:advice id="h2txAdvice" transaction-manager="transactionManagerH2"> <tx:attributes> <tx:method name="create*" rollback-for="Exception"/> <tx:method name="delete*" rollback-for="Exception"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="insert*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="*" read-only="true" rollback-for="Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="executeServiceH2" expression="execution(* com.lavasoft.ntv.service.*SVImpl.*(..))"/> <aop:advisor pointcut-ref="executeServiceH2" advice-ref="h2txAdvice"/> </aop:config> </beans>
spring-back.xml
<?xml version="1.0" encoding="UTF-8"?> <beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" xmlns:context="http://www.springframework.org/schema/context"> <context:annotation-config/> <!--<context:component-scan base-package="com.lavasoft.aac.daoh2" resource-pattern="Sys_userDAO.class"/>--> <context:component-scan base-package="com.lavasoft.aac.service" resource-pattern="H2SV.class"/> <!--<context:component-scan base-package="com.lavasoft.aac.dao" resource-pattern="*DAO.class"/>--> <!--<context:component-scan base-package="com.lavasoft.aac.service" resource-pattern="*SVImpl.class"/>--> <bean id="sys_userDAO" class="com.lavasoft.aac.daoh2.Sys_userDAO" parent="baseDAO"/> <import resource="classpath:/framework/spring-core.xml"/> </beans>
BaseMybatisDAO
/** * 通用DAO的Mybatis实现 * * @author leizhimin 11-12-12 下午10:42 */ public abstract class BaseMybatisDAO<E, PK extends Serializable> extends SqlSessionDaoSupport implements GenericDAO<E, PK> { protected String sqlmapNamespace; //ibatis sql map的命名空间,即使用实体类的简单名称 protected Class entityType; //运行时的实体类型,也对应为SQL的命名空间。 @Override public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } @Override public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { super.setSqlSessionTemplate(sqlSessionTemplate); }
BaseMybatisDAO省略具体实现代码,仅保留需要注入的两个setter方法。
测试下:
DEBUG 2014-04-16 17:33:35 org.mybatis.spring.SqlSessionUtils:104 - Creating a new SqlSession DEBUG 2014-04-16 17:33:35 org.mybatis.spring.SqlSessionUtils:140 - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d58ce2] was not registered for synchronization because synchronization is not active DEBUG 2014-04-16 17:33:35 org.springframework.jdbc.datasource.DataSourceUtils:110 - Fetching JDBC Connection from DataSource DEBUG 2014-04-16 17:33:35 org.mybatis.spring.transaction.SpringManagedTransaction:86 - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@1a7789c] will not be managed by Spring DEBUG 2014-04-16 17:33:35 Sys_user.insert:139 - ==> Preparing: insert into sys_user( fullname, account, password, salt, isExpired, isLock, createtime, status, email, mobile, phone, sex, picture, fromtype ) values( ?, ?, ?, ?, ?, ?, now(), ?, ?, ?, ?, ?, ?, ? ) DEBUG 2014-04-16 17:33:35 Sys_user.insert:139 - ==> Parameters: leizm(String), asdfa(String), 23492399(String), null, 0(Integer), 0(Integer), 0(Integer), [email protected](String), 139232302033(String), null, null, null, 0(Integer) DEBUG 2014-04-16 17:33:35 Sys_user.insert:139 - <== Updates: 1 DEBUG 2014-04-16 17:33:35 com.alibaba.druid.pool.PreparedStatementPool:123 - {conn-10002, pstmt-20003} enter cache DEBUG 2014-04-16 17:33:35 org.mybatis.spring.SqlSessionUtils:168 - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d58ce2] DEBUG 2014-04-16 17:33:35 org.springframework.jdbc.datasource.DataSourceUtils:327 - Returning JDBC Connection to DataSource 1 Process finished with exit code 0