收藏 分享(赏)

Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory.docx

上传人:kpmy5893 文档编号:7233134 上传时间:2019-05-10 格式:DOCX 页数:21 大小:45.57KB
下载 相关 举报
Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory.docx_第1页
第1页 / 共21页
Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory.docx_第2页
第2页 / 共21页
Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory.docx_第3页
第3页 / 共21页
Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory.docx_第4页
第4页 / 共21页
Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory.docx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、一、摘要上两篇文章分别介绍了 Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法 和 Spring3 整合 Hibernate3.5 动态切换 SessionFactory (切换数据库方言),这篇文章将介绍 Spring 整合 Mybatis 如何完成 SqlSessionFactory 的动态切换的。并且会简单的介绍下 MyBatis 整合 Spring 中的官方的相关代码。Spring 整合 MyBatis 切换 SqlSessionFactory 有两种方法,第一、 继承SqlSessionDaoSupport,重写获取 SqlSe

2、ssionFactory 的方法。第二、继承SqlSessionTemplate 重写 getSqlSessionFactory、getConfiguration 和SqlSessionInterceptor 这个拦截器。其中最为关键还是继承 SqlSessionTemplate 并重写里面的方法。而 Spring 整合 MyBatis 也有两种方式,一种是配置 MapperFactoryBean,另一种则是利用MapperScannerConfigurer 进行扫描接口或包完成对象的自动创建。相对来说后者更方便些。MapperFactoryBean 继承了 SqlSessionDaoSupp

3、ort 也就是动态切换 SqlSessionFactory的第一种方法,我们需要重写和实现 SqlSessionDaoSupport 方法,或者是继承MapperFactoryBean 来重写覆盖相关方法。如果利用 MapperScannerConfigurer 的配置整合来切换 SqlSessionFactory,那么我们就需要继承 SqlSessionTemplate,重写上面提到的方法。在整合的配置中很多地方都是可以注入 SqlSessionTemplate 代替SqlSessionFactory 的注入的。因为 SqlSessionTemplate 的创建也是需要注入SqlSessio

4、nFactory 的。二、实现代码1、继承 SqlSessionTemplate 重写 getSqlSessionFactory、getConfiguration 和SqlSessionInterceptorpackage com.hoo.framework.mybatis.support;import static java.lang.reflect.Proxy.newProxyInstance;import static org.apache.ibatis.reflection.ExceptionUtil.unwrapThrowable;import static org.mybatis.

5、spring.SqlSessionUtils.closeSqlSession;import static org.mybatis.spring.SqlSessionUtils.getSqlSession;import static org.mybatis.spring.SqlSessionUtils.isSqlSessionTransactional;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.sql.Connection;import java.util.List

6、;import java.util.Map;import org.apache.ibatis.exceptions.PersistenceException;import org.apache.ibatis.executor.BatchResult;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.ResultHandler;import org.apache.ibatis.session.Ro

7、wBounds;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.MyBatisExceptionTranslator;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.dao.support.PersistenceExceptionTranslator;import org.springframework.ut

8、il.Assert;/* function: 继承 SqlSessionTemplate 重写相关方法* author hoojo* createDate 2013-10-18 下午 03:07:46* file CustomSqlSessionTemplate.java* package com.hoo.framework.mybatis.support* project SHMB* blog http:/ email hoojo_* version 1.0*/public class CustomSqlSessionTemplate extends SqlSessionTemplate p

9、rivate final SqlSessionFactory sqlSessionFactory;private final ExecutorType executorType;private final SqlSession sqlSessionProxy;private final PersistenceExceptionTranslator exceptionTranslator;private Map targetSqlSessionFactorys;private SqlSessionFactory defaultTargetSqlSessionFactory;public void

10、 setTargetSqlSessionFactorys(Map targetSqlSessionFactorys) this.targetSqlSessionFactorys = targetSqlSessionFactorys;public void setDefaultTargetSqlSessionFactory(SqlSessionFactory defaultTargetSqlSessionFactory) this.defaultTargetSqlSessionFactory = defaultTargetSqlSessionFactory;public CustomSqlSes

11、sionTemplate(SqlSessionFactory sqlSessionFactory) this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType();public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) this(sqlSessionFactory, executorType, new MyBatisExceptionTranslator

12、(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), true);public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,PersistenceExceptionTranslator exceptionTranslator) super(sqlSessionFactory, executorType, exceptionTranslator);this.sqlSession

13、Factory = sqlSessionFactory;this.executorType = executorType;this.exceptionTranslator = exceptionTranslator;this.sqlSessionProxy = (SqlSession) newProxyInstance(SqlSessionFactory.class.getClassLoader(),new Class SqlSession.class , new SqlSessionInterceptor();this.defaultTargetSqlSessionFactory = sql

14、SessionFactory;Overridepublic SqlSessionFactory getSqlSessionFactory() SqlSessionFactory targetSqlSessionFactory = targetSqlSessionFactorys.get(CustomerContextHolder.getContextType();if (targetSqlSessionFactory != null) return targetSqlSessionFactory; else if (defaultTargetSqlSessionFactory != null)

15、 return defaultTargetSqlSessionFactory; else Assert.notNull(targetSqlSessionFactorys, “Property targetSqlSessionFactorys or defaultTargetSqlSessionFactory are required“);Assert.notNull(defaultTargetSqlSessionFactory, “Property defaultTargetSqlSessionFactory or targetSqlSessionFactorys are required“)

16、;return this.sqlSessionFactory;Overridepublic Configuration getConfiguration() return this.getSqlSessionFactory().getConfiguration();public ExecutorType getExecutorType() return this.executorType;public PersistenceExceptionTranslator getPersistenceExceptionTranslator() return this.exceptionTranslato

17、r;/* inheritDoc*/public T selectOne(String statement) return this.sqlSessionProxy. selectOne(statement);/* inheritDoc*/public T selectOne(String statement, Object parameter) return this.sqlSessionProxy. selectOne(statement, parameter);/* inheritDoc*/public Map selectMap(String statement, String mapK

18、ey) return this.sqlSessionProxy. selectMap(statement, mapKey);/* inheritDoc*/public Map selectMap(String statement, Object parameter, String mapKey) return this.sqlSessionProxy. selectMap(statement, parameter, mapKey);/* inheritDoc*/public Map selectMap(String statement, Object parameter, String map

19、Key, RowBounds rowBounds) return this.sqlSessionProxy. selectMap(statement, parameter, mapKey, rowBounds);/* inheritDoc*/public List selectList(String statement) return this.sqlSessionProxy. selectList(statement);/* inheritDoc*/public List selectList(String statement, Object parameter) return this.s

20、qlSessionProxy. selectList(statement, parameter);/* inheritDoc*/public List selectList(String statement, Object parameter, RowBounds rowBounds) return this.sqlSessionProxy. selectList(statement, parameter, rowBounds);/* inheritDoc*/public void select(String statement, ResultHandler handler) this.sql

21、SessionProxy.select(statement, handler);/* inheritDoc*/public void select(String statement, Object parameter, ResultHandler handler) this.sqlSessionProxy.select(statement, parameter, handler);/* inheritDoc*/public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler han

22、dler) this.sqlSessionProxy.select(statement, parameter, rowBounds, handler);/* inheritDoc*/public int insert(String statement) return this.sqlSessionProxy.insert(statement);/* inheritDoc*/public int insert(String statement, Object parameter) return this.sqlSessionProxy.insert(statement, parameter);/

23、* inheritDoc*/public int update(String statement) return this.sqlSessionProxy.update(statement);/* inheritDoc*/public int update(String statement, Object parameter) return this.sqlSessionProxy.update(statement, parameter);/* inheritDoc*/public int delete(String statement) return this.sqlSessionProxy

24、.delete(statement);/* inheritDoc*/public int delete(String statement, Object parameter) return this.sqlSessionProxy.delete(statement, parameter);/* inheritDoc*/public T getMapper(Class type) return getConfiguration().getMapper(type, this);/* inheritDoc*/public void commit() throw new UnsupportedOper

25、ationException(“Manual commit is not allowed over a Spring managed SqlSession“);/* inheritDoc*/public void commit(boolean force) throw new UnsupportedOperationException(“Manual commit is not allowed over a Spring managed SqlSession“);/* inheritDoc*/public void rollback() throw new UnsupportedOperati

26、onException(“Manual rollback is not allowed over a Spring managed SqlSession“);/* inheritDoc*/public void rollback(boolean force) throw new UnsupportedOperationException(“Manual rollback is not allowed over a Spring managed SqlSession“);/* inheritDoc*/public void close() throw new UnsupportedOperati

27、onException(“Manual close is not allowed over a Spring managed SqlSession“);/* inheritDoc*/public void clearCache() this.sqlSessionProxy.clearCache();/* inheritDoc*/public Connection getConnection() return this.sqlSessionProxy.getConnection();/* inheritDoc* since 1.0.2*/public List flushStatements()

28、 return this.sqlSessionProxy.flushStatements();/* Proxy needed to route MyBatis method calls to the proper SqlSession got from Springs Transaction Manager It also* unwraps exceptions thrown by code Method#invoke(Object, Object.) to pass a code PersistenceException to* the code PersistenceExceptionTr

29、anslator.*/private class SqlSessionInterceptor implements InvocationHandler public Object invoke(Object proxy, Method method, Object args) throws Throwable final SqlSession sqlSession = getSqlSession(CustomSqlSessionTemplate.this.getSqlSessionFactory(),CustomSqlSessionTemplate.this.executorType, Cus

30、tomSqlSessionTemplate.this.exceptionTranslator);try Object result = method.invoke(sqlSession, args);if (!isSqlSessionTransactional(sqlSession, CustomSqlSessionTemplate.this.getSqlSessionFactory() / force commit even on non-dirty sessions because some databases require/ a commit/rollback before calli

31、ng close()sqlSmit(true);return result; catch (Throwable t) Throwable unwrapped = unwrapThrowable(t);if (CustomSqlSessionTemplate.this.exceptionTranslator != null if (translated != null) unwrapped = translated;throw unwrapped; finally closeSqlSession(sqlSession, CustomSqlSessionTemplate.this.getSqlSe

32、ssionFactory();重写后的 getSqlSessionFactory 方法会从我们配置的 SqlSessionFactory 集合targetSqlSessionFactorys 或默认的 defaultTargetSqlSessionFactory 中获取 Session对象。而改写的 SqlSessionInterceptor 是这个 MyBatis 整合 Spring 的关键,所有的SqlSessionFactory 对象的 session 都将在这里完成创建、提交、关闭等操作。所以我们改写这里的代码,在这里获取 getSqlSessionFactory 的时候,从多个Sql

33、SessionFactory 中获取我们设置的那个即可。上面添加了 targetSqlSessionFactorys、defaultTargetSqlSessionFactory 两个属性来配置多个 SqlSessionFactory 对象和默认的 SqlSessionFactory 对象。CustomerContextHolder 设置 SqlSessionFactory 的类型package com.hoo.framework.mybatis.support;/* function: 多数据源* author hoojo* createDate 2013-9-27 上午 11:36:57*

34、 file CustomerContextHolder.java* package com.hoo.framework.spring.support* project SHMB* blog http:/ email hoojo_* version 1.0*/public abstract class CustomerContextHolder public final static String SESSION_FACTORY_MYSQL = “mysql“;public final static String SESSION_FACTORY_ORACLE = “oracle“;private

35、 static final ThreadLocal contextHolder = new ThreadLocal(); public static void setContextType(String contextType) contextHolder.set(contextType); public static String getContextType() return contextHolder.get(); public static void clearContextType() contextHolder.remove(); 2、配置相关的文件 applicationCont

36、ext-session-factory.xmlclasspath:com/hoo/framework/mybatis/mybatis-common.xmlclasspath:com/hoo/*/resultmap/*-resultmap.xmlclasspath:com/hoo/*/mapper/*-mapper.xmlclasspath:com/hoo/*/mapper/*/*-mapper.xmlclasspath:com/hoo/framework/mybatis/mybatis-common.xmlclasspath:com/hoo/*/resultmap/*-mysql-result

37、map.xmlclasspath:com/hoo/*/mapper/*-mysql-mapper.xmlclasspath:com/hoo/*/mapper/*/*-mysql-mapper.xmlclasspath:com/hoo/*/mapper/*/multiple-datasource-mapper.xml上面的配置关键是在 MapperScannerConfigurer 中注入 sqlSessionTemplate,这个要注意。当我们配置了多个 SqlSessionFactoryBean 的时候,就需要为MapperScannerConfigurer 指定一个 sqlSessionF

38、actoryBeanName 或是sqlSessionTemplateBeanName。一般情况下注入了 sqlSessionTemplateBeanName 对象,那 sqlSessionFactory 也就有值了。如果单独的注入了 sqlSessionFactory 那么程序会创建一个 sqlSessionTemplate 对象。我们可以看看代码 SqlSessionFactoryDaoSupport对象的代码。如果你不喜欢使用扫描的方式,也可以注入 sqlSessionTemplate 或继承sqlSessionTemplate 完成数据库操作。public abstract class

39、 SqlSessionDaoSupport extends DaoSupport private SqlSession sqlSession;private boolean externalSqlSession;public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) if (!this.externalSqlSession) this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);public void setSqlSessionTemplate(

40、SqlSessionTemplate sqlSessionTemplate) this.sqlSession = sqlSessionTemplate;this.externalSqlSession = true;这段代码很明显,如果注入了 sqlSessionTemplate 上面的注入也就不会执行了。如果没有注入 sqlSessionTemplate,那么会自动 new 一个 sqlSessionTemplate 对象。3、编写相关测试接口和实现的 mapper.xmlpackage com.hoo.server.datasource.mapper;import java.util.Lis

41、t;import java.util.Map;import com.hoo.framework.mybatis.SqlMapper;/* function: MyBatis 多数据源 测试查询接口* author hoojo* createDate 2013-10-10 下午 04:18:08* file MultipleDataSourceMapper.java* package com.hoo.server.datasource.mapper* project SHMB* blog http:/ email hoojo_* version 1.0*/public interface Mul

42、tipleDataSourceMapper extends SqlMapper public List execute4MySQL() throws Exception;public List execute4Oracle() throws Exception;multiple-datasource-mapper.xml上面分别查询 oracle 和 mysql 两个数据库中的 table4、测试代码AutowiredQualifier(“multipleDataSourceMapper“)private MultipleDataSourceMapper mapper;Testpublic v

43、oid testMapper() CustomerContextHolder.setContextType(CustomerContextHolder.SESSION_FACTORY_MYSQL);try trace(mapper.execute4MySQL(); catch (Exception e1) e1.printStackTrace();CustomerContextHolder.setContextType(CustomerContextHolder.SESSION_FACTORY_ORACLE);try trace(mapper.execute4Oracle(); catch (

44、Exception e) e.printStackTrace();运行后发现能够顺利查询出数据。如果你是重写 SqlSessionDaoSupport,那么方法如下package com.hoo.framework.mybatis.support;import java.util.Map;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionUtils;import org.mybatis

45、.spring.support.SqlSessionDaoSupport;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/* function: MyBatis 动态 SqlSessionFactory* author hoojo* createDate 2013-10-14 下午 02:32:19* file Dynam

46、icSqlSessionDaoSupport.java* package com.hoo.framework.mybatis.support* project SHMB* blog http:/ email hoojo_* version 1.0*/public class DynamicSqlSessionDaoSupport extends SqlSessionDaoSupport implements ApplicationContextAware private ApplicationContext applicationContext;private Map targetSqlSes

47、sionFactorys;private SqlSessionFactory defaultTargetSqlSessionFactory;private SqlSession sqlSession;Overridepublic final SqlSession getSqlSession() SqlSessionFactory targetSqlSessionFactory = targetSqlSessionFactorys.get(CustomerContextHolder.getContextType();if (targetSqlSessionFactory != null) set

48、SqlSessionFactory(targetSqlSessionFactory); else if (defaultTargetSqlSessionFactory != null) setSqlSessionFactory(defaultTargetSqlSessionFactory);targetSqlSessionFactory = defaultTargetSqlSessionFactory; else targetSqlSessionFactory = (SqlSessionFactory) applicationContext.getBean(CustomerContextHolder.getContextType();setSqlSessionFactory(targetSqlSessionFactory);this.sqlSession = SqlSessionUt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报