1. 程式人生 > >Spring3 整合MyBatis3 配置多資料來源 動態切換 選擇SqlSessionFactory

Spring3 整合MyBatis3 配置多資料來源 動態切換 選擇SqlSessionFactory

package 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;
/**
 * <b>function:</b> 繼承SqlSessionTemplate 重寫相關方法
 * @author hoojo
 * @createDate 2013-10-18 下午03:07:46
 * @file CustomSqlSessionTemplate.java
 * @package com.hoo.framework.mybatis.support
 * @project SHMB
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email [email protected]
 * @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<Object, SqlSessionFactory> targetSqlSessionFactorys;
    private SqlSessionFactory defaultTargetSqlSessionFactory;
    public void setTargetSqlSessionFactorys(Map<Object, SqlSessionFactory> 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> T selectOne(String statement) {
        return this.sqlSessionProxy.<T> selectOne(statement);
    }
    /**
     * {@inheritDoc}
     */
    public <T> T selectOne(String statement, Object parameter) {
        return this.sqlSessionProxy.<T> selectOne(statement, parameter);
    }
    /**
     * {@inheritDoc}
     */
    public <K, V> Map<K, V> selectMap(String statement, String mapKey) {
        return this.sqlSessionProxy.<K, V> selectMap(statement, mapKey);
    }
    /**
     * {@inheritDoc}
     */
    public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey) {
        return this.sqlSessionProxy.<K, V> selectMap(statement, parameter, mapKey);
    }
    /**
     * {@inheritDoc}
     */
    public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
        return this.sqlSessionProxy.<K, V> selectMap(statement, parameter, mapKey, rowBounds);
    }
    /**
     * {@inheritDoc}
     */
    public <E> List<E> selectList(String statement) {
        return this.sqlSessionProxy.<E> selectList(statement);
    }
    /**
     * {@inheritDoc}
     */
    public <E> List<E> selectList(String statement, Object parameter) {
        return this.sqlSessionProxy.<E> selectList(statement, parameter);
    }
    /**
     * {@inheritDoc}
     */
    public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
        return this.sqlSessionProxy.<E> 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);
    }
    /**
            
           

相關推薦

Spring3 整合MyBatis3 配置資料來源 動態切換 選擇SqlSessionFactory

package com.hoo.framework.mybatis.support; import static java.lang.reflect.Proxy.newProxyInstance; import static org.apache.ibatis.reflection.Excepti

Spring3 整合MyBatis3 配置資料來源 動態選擇SqlSessionFactory

1. Spring整合MyBatis切換SqlSessionFactory有兩種方法,第一、 繼承SqlSessionDaoSupport,重寫獲取SqlSessionFactory的方法。第二、繼承SqlSessionTemplate 重寫getSqlSessionFa

關於Spring3 + Mybatis3整合時,資料來源動態切換的問題

以前的專案經歷中,基本上都是Spring + Hibernate + Spring JDBC這種組合用的多。至於MyBatis,也就這個專案才開始試用,閒話不多說,進入正題。 以前的這種框架組合中,動態資料來源切換可謂已經非常成熟了,網上也有非常多的部落格介

Spring3 整合MyBatis3 配置多數據源 動態選擇SqlSessionFactory(轉)

poi lba == lan bat load -o esp int 1. Spring整合MyBatis切換SqlSessionFactory有兩種方法,第一、 繼承SqlSessionDaoSupport,重寫獲取Sql

springboot整合Mybatis配置資料來源

springboot配置多資料來源有好幾種方式 1.application.properties配置 ## 埠 server.port=8080 # 資料庫訪問配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spri

SpringBoot整合MybatisPlus配置資料來源

首先建立SpringBoot專案,匯入web模組; 匯入依賴: <!--aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId

spring資料來源動態切換及事務

原文地址:http://blog.csdn.net/liuxiao723846/article/details/43526549 1、使用了spring的aop思想,實現了動態資料來源的切換。 2、spring的事務管理,是基於資料來源的,所以如果要實現動態資料來源切換,而且在同一個資料來源中保證事

Spring Boot 資料來源動態切換開啟事務後,資料來源切換失敗

在專案中遇到需要使用多資料來源的情況,解決辦法是,使用註解,切面攔截來注入不同的dataSource。實現程式碼在底部。基本思路:在dao的方法前加上@TargetDataSource(ORDER_DATA_SOURCE)註解來表明使用的哪個資料來源。問題:事務開啟一般是在s

springmvc+mybatis 配置資料來源相互切換

         近日因為專案需求,需要動態切換資料來源,就稍稍做了下研究,理解的不深,有不對的地方還望高人指點。         直接貼上程式碼:   resource.xml <bean id="sqlSessionFactory" class="com.ho

spring控制資料庫讀寫分離(資料來源動態切換

問題描述: 專案一直是使用同一個資料庫進行讀和寫的操作,在寫操作時會鎖表,並且效率低,後期出現效能問題 原因描述: 專案只能操作一個數據源 需求描述: 配置多個數據源,利用切面進行動態切換 解決方案: 修改配置,並且增加切面進行自動控制 解決方式: 第一步:配置多個數據源

Spring Boot整合Druid配置資料來源

 Druid是阿里開發的資料庫連線池,功能強大,號稱Java語言中最好的資料庫連線池。本文主要介紹Srping Boot下用Druid配置多個數據源,demo環境為:Spring Boot 2.1.4.RELEASE、Druid 1.1.16。 1、引入依賴 <depen

專案要實現資料來源動態切換,咋搞?

文章首發於公眾號:程式設計大道   在做專案的時候,幾乎都會用到資料庫,很多時候就只連一個數據庫,但是有時候我們需要一個專案操作多個數據庫,不同的業務功能產生的資料存到不同的資料庫,那怎麼來實現資料來源的動態、靈活的切換呢?今天我們就來實現這個功能。 前期準備工作 我們需要有一臺聯網的電腦(用於ma

mybatis 資料來源動態切換

>筆者主要從事c#開發,近期因為專案需要,搭建了一套spring-cloud微服務框架,集成了eureka服務註冊中心、 gateway閘道器過濾、admin服務監控、auth授權體系驗證,集成了redis、swagger、jwt、mybatis多資料來源等各項功能。 具體搭建過程後續另寫播客介紹。具體結構如

SSM整合系列之 配置資料來源 利用AOP動態切換資料來源 實現讀寫分離

摘要:在開發的專案中大都都會使用讀寫分離的技術,本人目前開發的專案接觸到的都是主從複製(一主一從),就是一個Master資料庫,一個Slave資料庫。主庫負責資料插入、更新和實時資料查詢,從庫庫負責非實時資料查詢。在實際專案應用中,都是讀多寫少,而讀取資料通常比較複雜而且耗時,SQL語句

MyBatis 配置資料來源實現個數據庫動態切換

1.配置properties路徑 我的配置檔案   2.配置mybatis資料來源 配置 第二套資料來源 3 動態資料來源的配置 兩個key分別引入了 兩套資料來源,預設使用jsdx_telecom 4.配置SqlSessionFa

SSM整合系列之 配置資料來源並實現手動切換資料來源可實現讀寫分離

摘要:在之前的開發中有很多場景用到了多資料來源的情況,如在做資料冷熱遷移的時候,將冷資料遷移到另一個庫,查詢冷資料時需要切換資料庫;在和天貓京東等電商對接時,因為有多套系統在同時使用,在客戶授權時,需要根據客戶使用的版本,儲存到對應的資料庫中。基於此,在這裡呢簡單實現一個SSM系統的多資

Springboot資料來源配置--資料來源動態切換

在上一篇我們介紹了多資料來源,但是我們會發現在實際中我們很少直接獲取資料來源物件進行操作,我們常用的是jdbcTemplate或者是jpa進行操作資料庫。那麼這一節我們將要介紹怎麼進行多資料來源動態切換。新增本文實現的程式碼之後,只需要配置要資料來源就可以直接通過註解使用,

spring+mybatis配置資料來源總結,重點是動態載入資料來源,支援動態切換

最近在做一款遊戲的GM管理平臺,需要連線遊戲的資料庫去查詢資料;由於遊戲的每個服的資料是獨立的,所以就有了連線多個數據庫的問題;經過一番查詢,好在mybatis的學習資源還少,很快找到了配置多資料來源的方法;感謝以下大牛分享的學習資源: http://lvdong5830

Spring+Mybatis資料來源配置(四)——AbstractRoutingDataSource實現資料來源動態切換

有時候需要在程式中動態切換資料來源,那麼這個系列的之前的博文所闡述的方法就不再使用了,總不能通過程式更改config.properties檔案的dataSource的值,然後再重啟web伺服器以便載入applicationContext.xml檔案。這裡講訴的是如何利用Ab

Spring Boot配置資料來源並實現Druid自動切換

SpringBoot多資料來源切換,先上配置檔案: 1.pom: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"