Mybatis2: 객체 준비 및 실행
비트캠프 서초본원 엄진영 강사님의 수업을 듣고 정리했습니다.
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>