<1단계>
일단 maven repository 부터
기존 ibatis
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.4.726</version>
</dependency>
mybatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.1</version>
</dependency>
그러면, mybatis-xxx.jar 와 mybatis-spring-xxxx.jar 두개가 들어온다.
<2단계>
다음은 context.xml 설정
기본적인 dataSource 설정은 다르지 않으므로, 이부부 빼고...
기존의 SqlMapClient 를 SqlSession 으로 바꿔주기만 하면 된다.
기존 ibatis
<beans:bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<beans:property name="configLocations" value="classpath:/sqlmap/SqlMapConfig.xml" />
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="mappingLocations">
<beans:list>
<beans:value>classpath:/sqlmap/**/*.xml</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<beans:property name="sqlMapClient" ref="sqlMapClient" />
</beans:bean>
신규 mybatis
<beans:bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="configLocation" value="classpath:/mybatis-config.xml" />
<beans:property name="mapperLocations">
<beans:array>
<beans:value>classpath*:/sqlmap/**/*.xml</beans:value>
</beans:array>
</beans:property>
</beans:bean>
<beans:bean id="SqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<beans:constructor-arg index="0" ref="sqlSessionFactoryBean" />
</beans:bean>
transactionManager 도 동일하게 사용한다.
참고) mybatis-config.xml
원래는 이 파일 안에 database, transaction. connection 설정을 자체적으로 할 수 있게 해놨더라...
굳이 그런 기능까지 사용할 필요는 없을 듯 하여, 몇가지 간단한 설정만 넣었다.
<?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>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
</settings>
</configuration>
<3단계> Service 에 트랜잭션을 건다.
@Transactional
public int insert() throws Exception {
int result = 0;
result += testDao.newOne();
result += testDao.newOne();
logger.debug(">>>>> insert result : " + result);
return result;
}
이쪽 insert 를 호출하는 컨트롤러에서 Exception 처리를 해주어야 된다.
dao 를 두번 호출할때, Primary Key 중복으로 Exception 이 발생하면서 Rollback 된다.
이때, service 내의 메소드에서 try, catch 를 하면 안된다.
ibatis 는 저렇게 안해도 (메소드에서 try, catch 해도) 됐던것 같은데...
아래 참고
http://beans9.tistory.com/151
http://blog.naver.com/likemony/220069334128
http://blog.naver.com/artfile/130161954002
아! 그리고!!
iBatis 와 달라진 아주 눈에 띄는 점은
sqlMap-config.xml 에서 꼭 넣어야 했던 dummy.xml 이 없어진것!