评论

收藏

[MySQL] Spring3.2.8+Mybatis3.2.6 多数据源基于BaseDAO的配置

数据库 数据库 发布于:2021-07-04 09:33 | 阅读数:280 | 评论:0

  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), asdf@asdf.com(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
  

  

  

  


  
关注下面的标签,发现更多相似文章