Mybatis2: 객체 준비 및 실행

업데이트:
4 분 소요

비트캠프 서초본원 엄진영 강사님의 수업을 듣고 정리했습니다.


Mybatis2: 객체 준비 및 실행

1. Mybatis 객체 준비

  • XXXMapper.xml 파일과 mybatis-config.xml 파일 준비를 완료했다면, Mybatis 객체를 준비한다.
  • InputStream으로 mybatis 설정 파일을 읽어 들이고, SqlSesstionFactory를 생성할 때 이 inputstream에 대한 정보를 넘겨준다.
  • 이렇게 생성된 SqlSession이 SQL을 실행하는데, 이 때 mybatis 설정 파일에 담겨있는 mapper 파일의 SQL문을 실행하는 것이다.
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Exam0110 {
  public static void main(String[] args) throws Exception {
    // 1. mybatis 설정 파일을 읽을 InputStream 도구를 준비한다.
    // 1) 직접 파일 시스템 경로를 지정하기
    //  => 단 소스 파일 경로를 지정하지 말아라.
    //  => 컴파일된 후 XML 파일이 놓이는 경로를 지정해라.
    //  => 자바 패키지에 작성한 일반 파일은 그대로 빌드 디렉토리에 복사된다.
    //  => 예) 프로젝트폴더/bin/main/com/eomcs/mybatis/ex01/mybatis-config.xml
    InputStream mybatisConfigInputStream = new FileInputStream(//
        "./bin/main/com/eomcs/mybatis/ex01/mybatis-config.xml");

    // 2. SqlSessionFactory를 만들어 줄 빌더 객체 준비
    SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();

    // 3. SqlSession 객체를 만들어 줄 팩토리 객체 준비
    //  => mybatis는 Builder를 이용하여 SqlSessionFactory 객체를 만든다.
    //  => 이때 공장 객체를 만들 때 사용할 설정 파일을 지정한다.
    //  => 설정 파일의 경로를 직접 지정하지 말고,
    //     해당 파일을 읽을 때 사용할 InputStream을 넘겨줘라.
    SqlSessionFactory factory = factoryBuilder.build(mybatisConfigInputStream);

    // 4. SQL을 실행시키는 객체 준비
    //  => SqlSessionFactory 객체로부터 SqlSession 객체를 얻는다.
    //  => openSession()은 수동 커밋으로 SQL을 다루는 객체를 리턴한다.
    //  => 자동 커밋으로 SQL을 다루고 싶다면,
    //     openSession(boolean autoCommit) 메서드를 호출하라.
    SqlSession sqlSession = factory.openSession();

    sqlSession.close();
  }
}

Resources 클래스

  • mybatis 설정 파일의 경로를 직접 지정하면 애플리케이션 배포 경로가 바뀔 때 마다 소스를 변경하고 다시 컴파일 해야 하는 문제가 있다.
InputStream mybatisConfigInputStream = new FileInputStream(
	"./bin/main/com/eomcs/mybatis/ex01/mybatis-config.xml");
  • 좀 더 쉽게 Mybatis 설정 파일의 InputStream을 얻기 위해서 org.apache.ibatis.io.Resources을 활용한다. 자바 클래스가 있는 패키지 폴더에서 mybatis 설정 파일을 찾을 수 있다.
public class Exam0111 {
  public static void main(String[] args) throws Exception {
    // 1. mybatis 설정 파일을 읽을 InputStream 도구를 준비한다.
    //  => Resources 클래스의 메서드를 이용하여 
    //     자바 클래스가 있는 패키지 폴더에서 mybatis 설정 파일을 찾을 수 있다.
    InputStream mybatisConfigInputStream = Resources.getResourceAsStream(//
        "com/eomcs/mybatis/ex01/mybatis-config.xml");
    //  => 파라미터에 mybatis 설정 파일의 경로를 지정할 때,
    //     자바 패키지 경로를 그대로 이용한다.
    //  => 단 파일 경로이기 때문에 폴더와 폴더 사이를 가리킬 때
    //      . 대신에 / 를 사용해야 한다.
    //  => JVM은 현재 실행하는 애플리케이션의 자바 클래스 경로를 알고 있다.
    //  => 주의!
    //     자바 패키지 경로에서 찾기 때문에 mybatis 설정 파일은 반드시
    //     자바 패키지 경로에 있어야 한다.

    SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = factoryBuilder.build(mybatisConfigInputStream);
    SqlSession sqlSession = factory.openSession();
 **   sqlSession.close();
  }
}

코드 정리

public class Exam0112 {
  public static void main(String[] args) throws Exception {

    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(//
        Resources.getResourceAsStream(
            "com/eomcs/mybatis/ex01/mybatis-config.xml"));

    SqlSession sqlSession = factory.openSession();
    sqlSession.close();
  }
}

2. SQL 문 실행

SqlSession 객체를 이용하여 SQL 맵퍼 파일에 작성한 SQL 문을 실행한다.

select 문장

  • sqlSession.selectList() : 목록 리턴
  • sqlSession.selectOne() : 한 개의 결과 리턴

insert 문장

  • sqlSession.insert()

update 문장

  • sqlSession.update()

delete 문장

  • sqlSession.delete()

참고

  • insert/update/delete인 경우 insert()/update()/delete() 메서드 중 아무거나 호출해도 된다.
  • 하지만 일관된 유지보수를 위해 메서드를 구분하여 사용하라!

메서드 사용법

  • 메서드를 사용하기 위해서는 SQL문 식별자와 파라미터 값을 넘겨줘야 한다.
  • SQL문 식별자 = 그룹명 + “.” + SQL문장 아이디
    • 그룹명: <mapper namespace="그룹명"></mapper>
    • SQL 문장 아이디: <select id="SQL문장 아이디"></select>
  • 파라미터 값: primitive type 및 모든 자바 객체가 가능하다. 여러 개의 값을 전달할 때는 Map에 담아 넘겨라!
public class Exam0120 {
  public static void main(String[] args) throws Exception {
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(
        Resources.getResourceAsStream(
            "com/eomcs/mybatis/ex01/mybatis-config.xml"));
    
    SqlSession sqlSession = factory.openSession();

    List<Board> list = 
        sqlSession.selectList("BoardMapper.selectBoard");

    for (Board board : list) {
      System.out.printf("%d, %s, %s, %s, %d\n", 
          board.getNo(), 
          board.getTitle(), 
          board.getContent(),
          board.getRegisteredDate(),
          board.getViewCount());
    }
    sqlSession.close();
  }
} 

selectList() 동작 원리

<select id="selectBoard" resultType="com.eomcs.mybatis.ex01.Board">
	select 
		board_id,
		title,
		contents,
		created_date,
		view_count
	from x_board
</select>
  • resultType 에 지정한 클래스의 인스턴스를 생성한다.
  • 컬럼 이름과 일치하는 프로퍼티를 찾아 값을 입력한다.
    • board_id → setBoard_id(컬럼값)
    • title → setTitle(컬럼값)
    • contents → setContents(컬럼값)
    • created_date → setCreated_date(컬럼값)
    • view_count → setView_count(컬럼값)
  • 컬럼 이름과 일치하는 프로퍼티(setter)가 없다면 그 컬럼의 값은 객체에 담을 수 없다. 이 예제에서 컬럼 이름과 일치하는 프로퍼티는 title 밖에 없다.

컬럼 이름과 프로퍼티 이름을 일치시키기

  • 컬럼의 값을 자바 객체에 담으려면 컬럼과 같은 이름의 프로퍼티가 있어야 한다.
  • 없다면 프로퍼티 명을 컬럼의 별명으로 지정하라.
List<Board> list = sqlSession.selectList("BoardMapper.selectBoard2");

for (Board board : list) {
  System.out.printf("%d, %s, %s, %s, %d\n",
    board.getNo(), 
		board.getTitle(), 
		board.getContent(),
    board.getRegisteredDate(), 
		board.getViewCount());
}

BoardMapper.xml

<select id="selectBoard" resultType="com.eomcs.mybatis.ex01.Board">
  select
    board_id as no,
    title,
    contents as content,
    created_date as registeredDate,
    view_count as viewCount
  from x_board
</select>

클래스 별명 지정하기 I

  • mybatis 설정 파일에서 fully-qualified class name 을 사용하는 대신에 짧은 이름으로 대체할 수 있다.
  • 주의!
    • 패키지를 포함한 클래스 이름은 항상 . 으로 표기해야 한다. / 는 파일 경로를 가리킬 때 사용한다.
  • mybatis 설정 파일을 작성할 때, 자식 태그의 순서를 지켜야 한다. mybatis 설정 파일 작성 규칙에 순서를 지키도록 정의되어 있다.
<typeAliases>
	<typeAlias type="com.eomcs.mybatis.ex01.Board" alias="abc"/>
</typeAliases>
  • mybatis-config02.xml
<configuration>

  <properties resource="com/eomcs/mybatis/ex01/jdbc.properties"></properties>

  <typeAliases>
    <typeAlias type="com.eomcs.mybatis.ex01.Board" alias="Board"/>
  </typeAliases>

  <environments default="development">
    <environment id="development">
	
	...
  • 이렇게 지정한 별명은, SQL 맵퍼 파일에서 클래스를 지정할 때 사용한다.
<select id="selectBoard2" resultType=**"**Board**"**>
  select
    board_id as no,
    title,
    contents as content,
    created_date registeredDate,
    view_count viewCount
  from x_board
</select>

참고!

자바 primative type과 wrapper 클래스, String 클래스 등 일부 유틸리티 클래스 등에 대해서는 MyBatis가 미리 별명을 지정하였다.

원래 명칭 내장 별칭
int _int
int _integer
short _short
long _long
double _double
float _float
byte _byte
boolean _boolean
Integer int
Integer integer
Double double
Float float
String string
Byte byte
Long long
Short short
Date date
Object object
List list
ArrayList arraylist
Collection collection
Map map
HashMap hashmap
Iterator iterator

클래스 별명 지정하기 I

  • 패키지에 소속된 전체 클래스에 대해 별명을 부여할 수 있다.
  • 단, 별명은 클래스 이름이다.
<typeAliases>
    <package name="com.eomcs.mybatis.ex01"/>
</typeAliases>

태그:

카테고리:

업데이트: