




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、摘要上两篇文章分别介绍了Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法和Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言),这篇文章将介绍Spring整合Mybatis 如何完成SqlSessionFactory的动态切换的。并且会简单的介绍下MyBatis整合Spring中的官方的相关代码。Spring整合MyBatis切换SqlSessionFactory有两种方法,第一、 继承SqlSessionDaoSupport,重写获取SqlSessionFactory的方法。第二、继承SqlSessionTemplate 重写getSqlSessionFactory、getConfiguration和SqlSessionInterceptor这个拦截器。其中最为关键还是继承SqlSessionTemplate 并重写里面的方法。而Spring整合MyBatis也有两种方式,一种是配置MapperFactoryBean,另一种则是利用MapperScannerConfigurer进行扫描接口或包完成对象的自动创建。相对来说后者更方便些。MapperFactoryBean继承了SqlSessionDaoSupport也就是动态切换SqlSessionFactory的第一种方法,我们需要重写和实现SqlSessionDaoSupport方法,或者是继承MapperFactoryBean来重写覆盖相关方法。如果利用MapperScannerConfigurer的配置整合来切换SqlSessionFactory,那么我们就需要继承SqlSessionTemplate,重写上面提到的方法。在整合的配置中很多地方都是可以注入SqlSessionTemplate代替SqlSessionFactory的注入的。因为SqlSessionTemplate的创建也是需要注入SqlSessionFactory的。二、实现代码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.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;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.RowBounds;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.util.Assert;/* * function: 继承SqlSessionTemplate 重写相关方法 * author hoojo * createDate 2013-10-18 下午03:07:46 * file CustomSqlSessionTemplate.java * package com.hoo.framework.mybatis.support * project SHMB * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public class CustomSqlSessionTemplate extends SqlSessionTemplate private final SqlSessionFactory sqlSessionFactory; private final ExecutorType executorType; private final SqlSession sqlSessionProxy; private final PersistenceExceptionTranslator exceptionTranslator; private Map targetSqlSessionFactorys; private SqlSessionFactory defaultTargetSqlSessionFactory; public void setTargetSqlSessionFactorys(Map targetSqlSessionFactorys) this.targetSqlSessionFactorys = targetSqlSessionFactorys; public void setDefaultTargetSqlSessionFactory(SqlSessionFactory defaultTargetSqlSessionFactory) this.defaultTargetSqlSessionFactory = defaultTargetSqlSessionFactory; public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType(); public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) this(sqlSessionFactory, executorType, new MyBatisExceptionTranslator(sqlSessionFactory.getConfiguration() .getEnvironment().getDataSource(), true); public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) super(sqlSessionFactory, executorType, exceptionTranslator); this.sqlSessionFactory = sqlSessionFactory; this.executorType = executorType; this.exceptionTranslator = exceptionTranslator; this.sqlSessionProxy = (SqlSession) newProxyInstance( SqlSessionFactory.class.getClassLoader(), new Class SqlSession.class , new SqlSessionInterceptor(); this.defaultTargetSqlSessionFactory = sqlSessionFactory; Override public SqlSessionFactory getSqlSessionFactory() SqlSessionFactory targetSqlSessionFactory = targetSqlSessionFactorys.get(CustomerContextHolder.getContextType(); if (targetSqlSessionFactory != null) return targetSqlSessionFactory; else if (defaultTargetSqlSessionFactory != null) return defaultTargetSqlSessionFactory; else Assert.notNull(targetSqlSessionFactorys, Property targetSqlSessionFactorys or defaultTargetSqlSessionFactory are required); Assert.notNull(defaultTargetSqlSessionFactory, Property defaultTargetSqlSessionFactory or targetSqlSessionFactorys are required); return this.sqlSessionFactory; Override public Configuration getConfiguration() return this.getSqlSessionFactory().getConfiguration(); public ExecutorType getExecutorType() return this.executorType; public PersistenceExceptionTranslator getPersistenceExceptionTranslator() return this.exceptionTranslator; /* * 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 mapKey) 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 mapKey, 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.sqlSessionProxy. 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.sqlSessionProxy.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 handler) 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); /* * 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.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 UnsupportedOperationException(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 UnsupportedOperationException(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 UnsupportedOperationException(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() 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 PersistenceExceptionTranslator. */ 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, CustomSqlSessionTemplate.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 calling close() sqlSmit(true); return result; catch (Throwable t) Throwable unwrapped = unwrapThrowable(t); if (CustomSqlSessionTemplate.this.exceptionTranslator != null & unwrapped instanceof PersistenceException) Throwable translated = CustomSqlSessionTemplate.this.exceptionTranslator .translateExceptionIfPossible(PersistenceException) unwrapped); if (translated != null) unwrapped = translated; throw unwrapped; finally closeSqlSession(sqlSession, CustomSqlSessionTemplate.this.getSqlSessionFactory(); 重写后的getSqlSessionFactory方法会从我们配置的SqlSessionFactory集合targetSqlSessionFactorys或默认的defaultTargetSqlSessionFactory中获取Session对象。而改写的SqlSessionInterceptor 是这个MyBatis整合Spring的关键,所有的SqlSessionFactory对象的session都将在这里完成创建、提交、关闭等操作。所以我们改写这里的代码,在这里获取getSqlSessionFactory的时候,从多个SqlSessionFactory中获取我们设置的那个即可。上面添加了targetSqlSessionFactorys、defaultTargetSqlSessionFactory两个属性来配置多个SqlSessionFactory对象和默认的SqlSessionFactory对象。CustomerContextHolder 设置SqlSessionFactory的类型package com.hoo.framework.mybatis.support;/* * function: 多数据源 * author hoojo * createDate 2013-9-27 上午11:36:57 * file CustomerContextHolder.java * package com.hoo.framework.spring.support * project SHMB * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public abstract class CustomerContextHolder public final static String SESSION_FACTORY_MYS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高压电工操作证考试难点解析与备考策略
- 2025年验船师考试(C级船舶检验专业实务)冲刺模拟试题及答案一
- 北京市门头沟区2023-2024学年九年级下学期中考第二次模拟考试化学试题及答案
- 2025年心理咨询师进阶指南中级心理咨询面试题集及解析
- 栽树知识技能培训总结课件
- 2025年计算机二级考试全真模拟题及答案解析
- 2025年旅游管理专业知识测试卷及解析
- 公务员企业面试题及答案
- 校长防汛培训知识讲座课件
- 2025年初级美容美发师实操技能测试卷
- 过滤式消防自救呼吸器-安全培训
- 磐安县全域“无废城市”建设工作方案(2023-2025年)
- 达梦数据库管理系统技术白皮书
- 物料来料检验规范标准
- 辅警考试题库
- GB/T 19289-2019电工钢带(片)的电阻率、密度和叠装系数的测量方法
- 《中国特色社会主义政治经济学(第二版)》第一章导论
- 《安娜·卡列尼娜》-课件-
- 妇科疾病 痛经 (妇产科学课件)
- 《李将军列传》教学教案及同步练习 教案教学设计
- GMP基础知识培训(新员工入职培训)课件
评论
0/150
提交评论