大功告成,客户端使用:
Java代码
UserMapper mapper = MapperFactory.createMapper(UserMapper.class, DataSourceEnvironment.HD); User user = mapper.getUserById(162L); System.out.println(user);
OK,到此基本上所有的工作就完成了,以上的方式就可以支持多个数据源了。
但是代码还不够优雅,以上代码我们发现DataSourceEnvironment这个枚举变量在客户端,MapperFactory以及DataSourceEnvironment
中传来传去,我们应该尽量减少一个类对外界类的耦合,也就是不符合Java 编程原则中的迪米特法则。
好了,那我们来改良一下。
将MapperFactory设计成枚举策略模式:
Java代码
/**
* Mapper Creator
* @author boyce
* @version 2014-3-28
*/
public enum MapperFactory {
HD {
private SqlSessionFactory sqlSessionFactory;
@Override
public T createMapper(Class extends Mapper> clazz) {
return createMapper(clazz, this);
}
@Override
protected void createSqlSessionFactory() {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, this.name());
}
@Override
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
},
HO {
private SqlSessionFactory sqlSessionFactory;
@Override
public T createMapper(Class extends Mapper> clazz) {
return createMapper(clazz, this);
}
@Override
protected void createSqlSessionFactory() {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, this.name());
}
@Override
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
};
/**
* Create a mapper of environment by Mapper class
* @param clazz Mapper class
* @param environment A datasource environment
* @return a Mapper instance
*/
public abstract T createMapper(Class extends Mapper> clazz);
/**
* Create SqlSessionFactory of environment
*/
protected abstract void createSqlSessionFactory();
/**
* get SqlSessionFactory
*/
public abstract SqlSessionFactory getSqlSessionFactory();
private static InputStream inputStream = null;
static {
try {
inputStream = Resources.getResourceAsStream("mybatis/mybatis.xml");
HO.createSqlSessionFactory();
HD.createSqlSessionFactory();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(inputStream);
}
}
@SuppressWarnings("unchecked")
private static T createMapper(Class extends Mapper> clazz, MapperFactory MapperFactory) {
SqlSession sqlSession = MapperFactory.getSqlSessionFactory().openSession();
Mapper mapper = sqlSession.getMapper(clazz);
return (T)MapperProxy.bind(mapper, sqlSessio