[技术分享]-Mybatis配置多个数据源(Java)

首先,使用Mybatis配置多个数据源需要用到两个工具类:SqlSessionFactory   MapperFactory

/**
 * 根据mybatis.xml中配置的不同的environment创建对应的SqlSessionFactory
 */
public final class SqlSessionFactory {
    private static final Logger logger = LoggerFactory.getLogger(SqlSessionFactory.class);
    private static final String CONFIGURATION_PATH = "mybatis/mybatis-config.xml";
    private static final Map  SQLSESSIONFACTORYS = new HashMap();

    /**
     * 根据指定的DataSourceEnvironment获取对应的SqlSessionFactory
     */
    public static org.apache.ibatis.session.SqlSessionFactory getSqlSessionFactory(String datasource) {

        org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory = SQLSESSIONFACTORYS.get(datasource);
        if (!Objects.isNull(sqlSessionFactory))
            return sqlSessionFactory;
        else {
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(CONFIGURATION_PATH);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, datasource);


                logger.info("Get {} SqlSessionFactory successfully.", datasource);
            } catch (IOException e) {
                logger.warn("Get {} SqlSessionFactory error.", datasource);
                logger.error(e.getMessage(), e);
            } finally {
                IOUtils.closeQuietly(inputStream);
            }


            SQLSESSIONFACTORYS.put(datasource, sqlSessionFactory);
            return sqlSessionFactory;
        }
    }


}
/**
 * MapperFactory 创建一个Mapper实例 mapper
 */
public final class MapperFactory {
    private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MapperFactory.class);

    /**
     * 通过datasource 创建一个Mapper 的实现类 mapper
     */
    @SuppressWarnings("unchecked")
    public static  T createMapper(Class clazz, String datasource) {
        org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(datasource);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Mapper mapper = sqlSession.getMapper(clazz);
        return (T) MapperProxy.bind(mapper, sqlSession);
    }

    /**
     * Mapper代理: 执行 mapper 方法和关闭 sqlSession
     */
    private static class MapperProxy implements InvocationHandler {
        private Mapper mapper;
        private SqlSession sqlSession;

        private MapperProxy(Mapper mapper, SqlSession sqlSession) {
            this.mapper = mapper;
            this.sqlSession = sqlSession;
        }

        @SuppressWarnings("unchecked")
        private static Mapper bind(Mapper mapper, SqlSession sqlSession) {
            return (Mapper) Proxy.newProxyInstance(mapper.getClass().getClassLoader(),
                    mapper.getClass().getInterfaces(), new MapperProxy(mapper, sqlSession));
        }

        /**
         * 执行mapper方法并最终关闭sqlSession
         */
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object object = null;
            try {
                object = method.invoke(mapper, args);
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(e.getMessage(), e);
            } finally {
                sqlSession.close();
            }
            return object;
        }
    }

    /**
     * 获取数据源 datasource 的 SqlSessionFactory
     */
    private static org.apache.ibatis.session.SqlSessionFactory getSqlSessionFactory(String datasource) {
        return SqlSessionFactory.getSqlSessionFactory(datasource);
    }
}
其中,SqlSessionFactory根据mybatis.xml中配置的不同的environment创建对应的SqlSessionsqlSessionFactory,在由MapperFactory来使用这个sqlSession。
Mapper mapper = sqlSession.getMapper(Class clazz);
接着,在数据库配置文件jdbc.properties中,配置sql连接需要的参数:
api00.jdbc.url=jdbc:mysql://10.126.13.10:3307/XXXXX?characterSet=utf8mb4
api01.jdbc.url=jdbc:mysql://10.126.13.24:3307/XXXXX?characterSet=utf8mb4
api02.jdbc.url=jdbc:mysql://10.126.14.6:3307/XXXXX?characterSet=utf8mb4
api03.jdbc.url=jdbc:mysql://10.126.13.6:3307/XXXXX?characterSet=utf8mb4
api04.jdbc.url=jdbc:mysql://10.126.13.11:3307/XXXXX?characterSet=utf8mb4

api.jdbc.username=XXXXX
api.jdbc.password=XXXXX
api.jdbc.driverClassName=com.mysql.jdbc.Driver
在mybatis-config文件中,配置多个数据源的environment:





    
    
    
        
        
    

    
        
    

    
       
        
            
            
                
                
                
                
            
        
        
            
            
                
                
                
                
            
        
        
            
            
                
                
                
                
            
        
        
            
            
                
                
                
                
            
        
        
            
            
                
                
                
                
            
        
    


    
        
        
    



OK 到现在为止,工具类以及配置文件都已经写好了,可以在使用了~

使用的时候,首先new 一个空接口Mapper,以作为所有实现该接口的都是mapper实现类的标识

public interface Mapper {
}
一个具体mapper的接口:

public interface ChannelDao extends Mapper {

    Long checkRelationship(@Param("fromId") String fromId,
                           @Param("userId") Long userId);
}
然后就可以在工程中使用了:

ChannelDao channelDao = MapperFactory.createMapper(ChannelDao.class, "api01");
channelID = channelDao.checkRelationship("XXXXX", 123456);
通过 MapperFactory.createMapper方法,传入mapper对象与数据源,即可简单便捷的连接到任意配置好的数据源了~


你可能感兴趣的:(SQL,技术分享)