您的位置:首页 > 编程语言 > Java开发

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

2018-01-31 17:26 381 查看
首先,使用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对象与数据源,即可简单便捷的连接到任意配置好的数据源了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis