/* * @(#)MyBatisConfigurationsWrapper.java 2013-3-9 下午23:33:33 * * Copyright (c) 2011-2013 Makersoft.org all rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * */ package org.makersoft.shards.cfg; import java.lang.reflect.Method; import java.util.List; import org.apache.ibatis.binding.BindingException; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.reflection.factory.ObjectFactory; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; /** * 此类用于包裹MyBatis-Shards多个Shard合并后的Configuration. * (只重写用的到的几个方法) */ public class MyBatisConfigurationsWrapper extends Configuration { private final Configuration configuration; private final List<SqlSessionFactory> sqlSessionFactories; public MyBatisConfigurationsWrapper(Configuration configuration, List<SqlSessionFactory> sqlSessionFactories) { this.configuration = configuration; this.sqlSessionFactories = sqlSessionFactories; } @Override public Environment getEnvironment() { return configuration.getEnvironment(); } @Override public ExecutorType getDefaultExecutorType() { return configuration.getDefaultExecutorType(); } @Override public ObjectFactory getObjectFactory() { return configuration.getObjectFactory(); } @Override public <T> T getMapper(Class<T> type, SqlSession sqlSession) { for (SqlSessionFactory sqlSessionFactory : getSqlSessionFactories()) { T mapper = null; try { mapper = sqlSessionFactory.getConfiguration().getMapper(type, sqlSession); } catch (BindingException e) { // ignore exception } if (mapper != null) { return mapper; } } throw new BindingException("Type " + type + " is not known to the MapperRegistry."); } @Override public boolean hasMapper(Class<?> type) { for (SqlSessionFactory factory : getSqlSessionFactories()) { if (factory.getConfiguration().hasMapper(type)) { return true; } } return false; } @Override public MappedStatement getMappedStatement(String id) { Exception exception = null; MappedStatement mappedStatement = null; for (SqlSessionFactory sqlSessionFactory : getSqlSessionFactories()) { try { mappedStatement = sqlSessionFactory.getConfiguration().getMappedStatement(id); } catch (Exception e) { // ignore exception exception = e; } if (mappedStatement != null) { return mappedStatement; } } throw new BindingException("Invalid bound statement (not found): " + id, exception); } @Override public boolean hasStatement(String statementName, boolean validateIncompleteStatements) { if (validateIncompleteStatements) { buildAllStatements(); } for (SqlSessionFactory sqlSessionFactory : getSqlSessionFactories()) { try { boolean has = sqlSessionFactory.getConfiguration().getMappedStatementNames().contains(statementName); if(has) { return true; } } catch (Exception e) { // ignore exception } } return false; } @Override protected void buildAllStatements() { for (SqlSessionFactory sqlSessionFactory : getSqlSessionFactories()) { try { Configuration configuration = sqlSessionFactory.getConfiguration(); Method m = Configuration.class.getDeclaredMethod("buildAllStatements"); m.setAccessible(true); m.invoke(configuration); } catch (Exception e) { // ignore exception } } } private List<SqlSessionFactory> getSqlSessionFactories() { return sqlSessionFactories; } }