JPA가 세팅되어 있는 프로젝트에 Mybatis를 같이 사용하기 위해 세팅하는 과정입니다.
복잡성 있는 쿼리를 Read용으로 사용하기 위해 세팅했으며, Transaction 처리는 추가로 필요합니다.
JPA가 세팅되어 있는 상태 기준으로 작성했습니다.
pom.xml
<!-- mybatis 라이브러리 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
MybatisConfig.java
JPA와 같이 사용할 것이라서 따로 Config 파일을 생성하였습니다.
@Configuration
@MapperScan(basePackages = {"kr.demo.test.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory", sqlSessionTemplateRef = "sqlSessionTemplate")
public class MybatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
// mapper.xml 의 resultType 패키지 주소 생략
sqlSessionFactoryBean.setTypeAliasesPackage("kr.demo.test.model.entity");
// mybatis 설정 파일 세팅
sqlSessionFactoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis/mybatis-config.xml"));
// mapper.xml 위치 패키지 주소
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
mybatis-config.xml
<?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>
<!-- 카멜 케이스 VO 매핑 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 쿼리 결과 필드가 null인 경우, 누락이 되서 나오지 않게 설정-->
<setting name="callSettersOnNulls" value="true"/>
<!-- 쿼리에 보내는 파라미터가 null인 경우, 오류가 발생하는 것 방지 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
</configuration>
mapper
@Repository
public interface PostMapper {
public List<Post> getList() throws Exception;
}
mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.demo.test.mapper.board.PostMapper">
<select id="getList" resultType="Post">
SELECT
*
/* post_id as postId
,post_title as postTitle
,post_content
,updated_user
,updated_time*/
FROM post
<where>
<if test="TRUE">
</if>
</where>
</select>
</mapper>
DB 컬럼은 스네이크 케이스이고 Java entity는 카멜 케이스이지만, mybatis-config에서
<setting name="mapUnderscoreToCamelCase" value="true"/> 설정을 추가 했기 때문에 자동으로 매핑이 됩니다.