공식 문서: https://mybatis.org/mybatis-3/ko/getting-started.html
pom.xml 추가
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
https://search.maven.org/search?q=g:org.mybatis
Test 클래스 생성
String resource = "mybatis-config-test.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
MyBatis에서 Session은 JDBC에서 connection의 역할을 한다
지금은 Test 환경에서 사용해보고자 Test/resources아래에 나뒀지만 실제 쓸때는 원래 resources에 놔두면 된다.
mybatis-config-test.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>
<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>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
우선 실행할 때는 #{}를 하드코딩해서 다 바꿔주었다.
XMl을 사용하지 않고 진행할 수도 있지만 우선 XML을 이용했다. XML을 사용하지 않고 SqlSessionFactory 빌드하기는 공식 문서를 참고하자
try (SqlSession session = sqlSessionFactory.openSession()) {
List<ProductDto> productDtoList = session.selectList("ProductMapper.selectByCategoryId", 1);
log.info("DEBUG : {}", productDtoList);
}
JDBC에서 connection과 비슷한 역할을 하는 것이 session인데, 마찬가지로 자원을 얻었으면 반드시 close 해줘야 한다. try with resource를 이용해서 자동으로 닫히게 했다.
MyBatisTest.java
package com.ntscorp.intern.dao;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ntscorp.intern.product.dto.ProductDto;
public class MyBatisTest {
private static final Logger log = LoggerFactory.getLogger(MyBatisTest.class);
@Test
public void gettingStarted() throws IOException {
String resource = "mybatis-config-test.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
List<ProductDto> productDtoList = session.selectList("ProductMapper.selectByCategoryId", 1);
log.info("DEBUG : {}", productDtoList);
}
}
}
구문은 XML이나 애노테이션을 사용해서 정의할 수 있다. 그럼 먼저 XML 을 보자. 마이바티스가 제공하는 대부분의 기능은 XML을 통해 매핑 기법을 사용한다.
ProductMapper
<?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="ProductMapper">
<select id="selectByCategoryId" resultType="com.ntscorp.intern.product.dto.ProductDto">
SELECT display_info.id, display_info.place_name, product.content AS ProductContent,
product.description AS productDescription,
display_info.product_id, file_info.save_file_name AS productImageUrl
FROM product JOIN display_info ON product.id = display_info.product_id
JOIN product_image ON product.id = product_image.product_id
JOIN file_info ON product_image.file_id = file_info.id
WHERE product.category_id = 1 AND product_image.type = 'th' ;
</select>
</mapper>
여기서보면
namespace
와id
가 있는 것을 알 수 있다.List<ProductDto> productDtoList = session.selectList("ProductMapper.selectByCategoryId", 1);
이것을 이용해서
namespace.id
형식으로 가져와서 사용한다.
참고 네임스페이스(Namespaces)에 대한 설명
네임스페이스(Namespaces)가 이전버전에서는 사실 선택사항이었다. 하지만 이제는 패키지경로를 포함한 전체 이름을 가진 구문을 구분하기 위해 필수로 사용해야 한다.
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>