mybatis如何配置使用多个数据源?
一、数据库连接properties配置文件,两个数据源的地址: Java代码
hd.jdbc.driverClassName=com.mysql.jdbc.Driver
hd.jdbc.url=jdbc:mysql://127.0.0.1::3306/hd?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
hd.jdbc.username=root
hd.jdbc.password=root
ho.jdbc.driverClassName=com.mysql.jdbc.Driver
ho.jdbc.url=jdbc:mysql://127.0.0.1:3306/ho?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
ho.jdbc.username=root
ho.jdbc.password=root
二、mybatis配置文件,配置两个environment:
Xml代码
三、获取SqlSessionFactory,获取Mapper代理,便于在执行完Mapper方法后关闭SqlSession。
SqlSessionFactory的获取:
Java代码
/**
* 根据mybatis.xml中配置的不同的environment创建对应的SqlSessionFactory
* @author boyce
* @version 2014-3-27
*/
public final class DataSourceSqlSessionFactory {
private static final String CONFIGURATION_PATH = "mybatis/mybatis.xml";
private static final Map SQLSESSIONFACTORYS
= new HashMap();
/**
* 根据指定的DataSourceEnvironment获取对应的SqlSessionFactory
* @param environment 数据源environment
* @return SqlSessionFactory
*/
public static SqlSessionFactory getSqlSessionFactory(DataSourceEnvironment environment) {
SqlSessionFactory sqlSessionFactory = SQLSESSIONFACTORYS.get(environment);
if (ObjectUtils.isNotNull(sqlSessionFactory))
return sqlSessionFactory;
else {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(CONFIGURATION_PATH);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, environment.name());
logger.info("Get {} SqlSessionFactory successfully.", environment.name());
} catch (IOException e) {
logger.warn("Get {} SqlSessionFactory error.", environment.name());
logger.error(e.getMessage(), e);
}
finally {
IOUtils.closeQuietly(inputStream);
}
SQLSESSIONFACTORYS.put(environment, sqlSessionFactory);
return sqlSessionFactory;
}
}
/**
* 配置到Configuration.xml文件中的数据源的environment的枚举描述
* @author boyce
* @version 2014-3-27
*/
public static enum DataSourceEnvironment {
HD,
HO;
}
}
定义一个统一的Mapper标识接口,每一个具体的Mapper接口继承该接口:
Java代码
/**
* Mapper Interface
* @author boyce
* @version 2014-3-28
*/
public interface Mapper {
}
定义一个Mapper代理工厂:
Java代码
/**
* Mapper Factory
* @author boyce
* @version 2014-3-28
*/
public final class MapperFactory {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MapperFactory.class);
/**
* Create a mapper of environment by Mapper class
* @param clazz Mapper class
* @param environment A datasource environment
* @return a Mapper instance
*/
@SuppressWarnings("unchecked")
public static T createMapper(Class extends Mapper> clazz, DataSourceEnvironment environment) {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(environment);
SqlSession sqlSession = sqlSessionFactory.openSession();
Mapper mapper = sqlSession.getMapper(clazz);
return (T)MapperProxy.bind(mapper, sqlSession);
}
/**
* Mapper Proxy
* executing mapper method and close sqlsession
* @author boyce
* @version 2014-4-9
*/
private static class MapperProxy implements InvocationHandler {
private Mapper mapper;
private SqlSession sqlSession;
private Mapper