zoukankan      html  css  js  c++  java
  • Mabatis配置多数据源

    首先,使用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<String, org.apache.ibatis.session.SqlSessionFactory>  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> T createMapper(Class<? extends Mapper> 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<? extends Mapper> 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:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>

    <properties resource="mybatis/jdbc.properties"/>
    <!-- 全局参数 -->
    <settings>
    <!-- 使用驼峰命名法转换字段。 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
    <package name="com.XXX.XXX"/>
    </typeAliases>

    <environments default="wemedia">

    <environment id="api00">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
    <property name="url" value="${api00.jdbc.url}" />
    <property name="driver" value="${api.jdbc.driverClassName}" />
    <property name="username" value="${api.jdbc.username}" />
    <property name="password" value="${api.jdbc.password}" />
    </dataSource>
    </environment>
    <environment id="api01">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
    <property name="url" value="${api01.jdbc.url}" />
    <property name="driver" value="${api.jdbc.driverClassName}" />
    <property name="username" value="${api.jdbc.username}" />
    <property name="password" value="${api.jdbc.password}" />
    </dataSource>
    </environment>
    <environment id="api02">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
    <property name="url" value="${api02.jdbc.url}" />
    <property name="driver" value="${api.jdbc.driverClassName}" />
    <property name="username" value="${api.jdbc.username}" />
    <property name="password" value="${api.jdbc.password}" />
    </dataSource>
    </environment>
    <environment id="api03">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
    <property name="url" value="${api03.jdbc.url}" />
    <property name="driver" value="${api.jdbc.driverClassName}" />
    <property name="username" value="${api.jdbc.username}" />
    <property name="password" value="${api.jdbc.password}" />
    </dataSource>
    </environment>
    <environment id="api04">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
    <property name="url" value="${api04.jdbc.url}" />
    <property name="driver" value="${api.jdbc.driverClassName}" />
    <property name="username" value="${api.jdbc.username}" />
    <property name="password" value="${api.jdbc.password}" />
    </dataSource>
    </environment>
    </environments>


    <mappers>
    <mapper resource="mybatis/mapper/XXX.xml"/>
    <mapper resource="mybatis/mapper/YYY.xml"/>
    </mappers>


    </configuration>
    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对象与数据源,即可简单便捷的连接到任意配置好的数据源了~


    ---------------------
    作者:Qiao丫头
    来源:CSDN
    原文:https://blog.csdn.net/qiaoqiao0609/article/details/79219540?utm_source=copy
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    JAVA学习---文件和流
    JAVA学习---集合和工具类
    JAVA学习---异常
    python-time模块
    python-并发编程
    python-网络编程
    python-并发编程之进程
    python-面向对象之多态
    python-面向对象之反射
    python-面向对象之封装
  • 原文地址:https://www.cnblogs.com/Byronlyu/p/9803765.html
Copyright © 2011-2022 走看看