[스프링] MyBatis

June·2021년 8월 17일
1

MyBatis

공식 문서: 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 클래스 생성

XML에서 SqlSessionFactory 빌드하기**

		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 빌드하기는 공식 문서를 참고하자

SqlSessionFactory에서 SqlSession 만들기

		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);
		}
	}
}

매핑된 SQL 구문 살펴 보기

구문은 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>

여기서보면 namespaceid가 있는 것을 알 수 있다.

List<ProductDto> productDtoList = 
	session.selectList("ProductMapper.selectByCategoryId", 1);

이것을 이용해서 namespace.id 형식으로 가져와서 사용한다.

참고 네임스페이스(Namespaces)에 대한 설명
네임스페이스(Namespaces)가 이전버전에서는 사실 선택사항이었다. 하지만 이제는 패키지경로를 포함한 전체 이름을 가진 구문을 구분하기 위해 필수로 사용해야 한다.

MyBatis 스프링 연동

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.6</version>
</dependency>

0개의 댓글