MyBatis란 무엇인가?
- 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
- JDBC코드와 수동으로 셋팅하는 파라미터와 결과 매핑을 제거한다.(코드의 간결성 및 유지보수성 향상)
- 데이터베이스 레코드에 원시타입과 Map인터페이스 그리고 자바 POJO를 설정하고 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
MyBatis3 구성요소 및 예제
- MyBatis configuration file : 데이터베이스 설정과 트랜잭션 등 마이바티스가 동작하는 규칙을 정의하는 작업 설정 파일.
- org.apache.ibatis.session.SqlSessionFactoryBuilder : MyBatis3 구성 파일을 읽고 생성하는 SqlSessionFactory 구성요소.
- org.apache.ibatis.session.SqlSessionFactory : SqlSession을 생성하는 구성 요소.
- org.apache.ibatis.session.SqlSession : SQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 구성 요소로서 MyBatis3를 사용하여 데이터베이스에 액세스할 때 가장 중요한 역할을 한다.
- Mapper interface : typeafe에서 매핑 파일에 정의된 SQL을 호출하는 인터페이스. MyBatis3는 매퍼 인터페이스에 대한 구현 클래스를 자동으로 생성하므로 개발자는 인터페이스만 생성하면 된다.
- Mapping file : SQL 및 O/R 매핑 설정을 설명하는 XML 파일.
모든 마이바티스 앱은 SqlSessionFactory를 사용한다. SqlSessionFactory는 SqlSessionFactoryBuilder를 사용하여 만들수 있고 XML설정파일에서 SqlSessionFactory를 빌드할 수 있다.
InputStream인스턴스를 사용하여 자원을 사용하는 예시이며 마이바티스는 클래스패스와 다른 위치에서 자원을 로드하는 것으로 좀더 쉽게 해주는 Resources라는 유틸성 클래스를 가지고 있다.
private SqlSessionFactory getSqlSessionFactory() {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
return new SqlSessionFactoryBuilder().build(inputStream);
}
XML설정파일의 최상단에서는 XML문서의 유효성을 체크하고 environment는 트랜잭션 관리와 커넥션 풀링을 위한 환경설정을 나타낸다. transactionManager는 트랜잭션 제어, dataSource는 DB Connection 인스턴스를 가져오기 위함이다.
mappers에는 매핑정의와 SQL코드를 가지는 mapper를 지정한다.(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>
<typeAliases>
<typeAlias type="mybatis.Comment" alias="Comment"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="scott"/>
<property name="password" value="1111"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/CommentMapper.xml"/>
</mappers>
</configuration>
아까 설명했던 SqlSessionFactory에서 SqlSession를 생성하여 간단한 select를 하는 예제이다. SqlSession을 닫을때는
꼭 finally 블록에서 닫아야 한다.
public List<Comment> selectComment() {
SqlSession sqlSession = getSqlSessionFactory().openSession();
try {
return sqlSession.selectList(namespace + ".selectComment");
} finally {
sqlSession.close();
}
}
CommentMapper라는 네임스페이스를 통해 CommentMapper.selectComment가 불려져서 테이블 TCOMMENT의 컬럼값 4개를 출력할 수 있다. 하나의 매퍼 XML파일(CommentMapper.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="CommentMapper">
<cache />
<sql id="BaseColumns">
comment_no AS commentNo,
user_id AS userId,
comment_content
AS commentContent,
reg_date AS regDate
</sql>
<!-- select -->
<select id="selectComment" resultType="Comment">
SELECT
<include refid="BaseColumns" />
FROM TCOMMENT
</select>