Добавление mapper в конфигурацию myBatis в Java - PullRequest
1 голос
/ 16 марта 2012

Я хочу перейти с конфигурации XML на конфигурацию Java.

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

Мне удалось заменить весь <environments> раздел конфигурацией Java (я удалил <environments> из XML-файла конфигурации), но не могу избавиться от:

 <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

1 Ответ

2 голосов
/ 11 января 2013

Я использую нижеприведенную фабрику абстрактных карт, где 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);
}
...