spring 등 여타 framework 에서 sql query xml 을 mybatis 에 설정 하는 방법은
@MapperScan annotation 을 활용하거나 mybatis 의 scan 등을 활용해 mapper 를 손쉽게 설정 할 수 있다.
하지만 독립적으로 mybatis 를 사용하면서 로직에 따라 동적으로 mapper 를 등록해야 하는 일이 생겼는데
공식 reference site 에 딱히 방법이 나와 있지 않아 난감해진적이 있었다.
그때 해결했던 이력을 남겨본다.
핵심만 말하자면
mybatis 라이브러리안에 XMLMapperBuilder 라는 class 를 활용해 해결할 수 있다.
아래는 test 했던 난잡한 sample code 이다. 그래도 작은 도움은 될거라 생각된다.
참고로 아래는 독립적인 mybatis 에서 xml scan 하는 설정이다. (mybatis.xml)
/**
* Created by fall1999y on 2016. 6. 23..
*/
public class SessionFactoryProvider {
private static final String mapperFiles[] = {"mybatis/sql/testsql.xml", "mybatis/sql/samplesql.xml"};
public SqlSessionFactory produceFactory() {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
throw new RuntimeException("Fatal Error. Cause: " + e, e);
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
for (String mapperFile : mapperFiles) {
InputStream in = getClass().getClassLoader().getResourceAsStream(mapperFile);
Configuration configuration = sqlSessionFactory.getConfiguration();
if (in != null) {
XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(in, configuration, mapperFile, configuration.getSqlFragments());
xmlMapperBuilder.parse();
} else {
System.err.println("Error file not loaded " + mapperFile);
}
}
return sqlSessionFactory;
}
public static void main(String[] args) {
SessionFactoryProvider provider = new SessionFactoryProvider();
SqlSessionFactory factory = provider.produceFactory();
SqlSession s = factory.openSession();
TestMapper mapper = s.getMapper(TestMapper.class);
System.out.println(mapper.selectTestTable());
SampleMapper sampleMapper = s.getMapper(SampleMapper.class);
System.out.println(sampleMapper.selectSampleTable());
}
}
참고로 아래는 독립적인 mybatis 에서 xml scan 하는 설정이다. (mybatis.xml)
<mappers>
<package..
부분만 보면 이해가 가능하다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="properties/db.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="development2">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="net.vjvj.mapper"/>
</mappers>
</configuration>
댓글 없음:
댓글 쓰기