2012-03-16 44 views
1

我想從XML配置遷移到Java配置。將映射器添加到Java中的myBatis配置中

sqlSessionFactory.getConfiguration().setEnvironment(new Environment("development", new org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory(), getDataSouroce())); 

我設法更換所有<environments>部分用Java配置(我從XML配置文件中刪除<environments>),但我無法擺脫的:

<mappers><mapper resource="mailbox/db/map/FileMapper.xml"/> </mappers> 

我試着寫:

sqlSessionFactory.getConfiguration()。addMapper(FileMapper.class);

但也有例外:

SqlSession sqlSession = MyBatisConnectionFactory.instance.getSqlSessionFactory().openSession(); 

    FileExample fe = new FileExample(); 
    Criteria f = fe.createCriteria().andIdBetween(0L, 5L); 
    FileMapper mapper = (FileMapper) sqlSession.getMapper(FileMapper.class); 
    List<File> allRecords = mapper.selectByExample(fe); 

// Mapped Statements collection does not contain value for mailbox.db.dao.FileMapper.selectByExample 

回答

2

我使用下面的抽象映射器工廠,DbUtil.getInstance()了getDataSource()和registerMappers()是關鍵點。

public abstract class AbstractMapperFactory implements MapperFactory { 

    private ThreadLocal<SqlSessionManager> sessionManagerThreadLocal = new ThreadLocal<SqlSessionManager>(); 

    public <T> T getMapper(Class<T> clazz) throws DaoException { 
     if(sessionManagerThreadLocal.get() == null) { 
      initialize(); 
     } 
     return sessionManagerThreadLocal.get().getMapper(clazz); 
    } 

    public void closeSession() { 
     if(sessionManagerThreadLocal.get() != null) { 
      sessionManagerThreadLocal.get().close(); 
      sessionManagerThreadLocal.remove(); 
     } 
    } 

    private void initialize() throws DaoException { 
     Environment environment = new Environment("env", new ManagedTransactionFactory(), DbUtil.getInstance().getDataSource()); 
     Configuration configuration = new Configuration(environment); 
     registerMappers(configuration); 
     sessionManagerThreadLocal.set(SqlSessionManager.newInstance(new SqlSessionFactoryBuilder().build(configuration))); 
    } 

    protected abstract void registerMappers(Configuration configuration); 

} 

凡DbUtil.getInstance()了getDataSource()負責獲取java.sql.DataSource情況下,無論是管理還是簡單。

registerMappers()是一個抽象方法,其中,子類可以使用註冊其映射器代碼象下面這樣:

protected void registerMappers(Configuration configuration) { 
    configuration.addMapper(PartMapper.class); 
    configuration.addMapper(StatusMapper.class); 
    configuration.addMapper(NoteTypeMapper.class); 
    configuration.addMapper(AssetTypeMapper.class); 
}