Mybatis란?
개발자가 지정한 sql 저장 프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
- JDBC에서 처리하는 코드와 파라미터 설정 및 결과 매핑을 대신 해준다.
- 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해 xml과 어노테이션을 사용할 수 있다.
사용법
1. xml에서 SqlSessionFactory 빌드하기
- 모든 Mybatis 어플리케이션은 SqlSessionFactory 인스턴스를 사용한다.
- SqlSessionFactory 인스턴스는 SqlSessionFactoryBuilder를 사용하여 만들 수 있다.
- SqlSessionFactoryBuilder는 XML설정파일에서 SqlSessionFactory 인스턴스를 빌드 할 수 있다.
ex) SqlSessionFactory인스턴스를 빌드하기
String resource= "org/mybatis/exam/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
ex) mybatis-config.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/exam/HelloMapper.xml"/>
</mappers>
</configuration>
ex) HelloMapper.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="org.mybatis.exam.HelloMapper">
<select id="selectHello" resultType="Hello">
select * from Hello where id = #{id}
</select>
</mapper>
2. SqlSessionFactory에서 SqlSession만들기
- SqlSession SQL 명령어를 실행하기 위해 필요한 모든 메서드를 가지고 있고, SqlSession인스턴스를 통해 직접 SQL 구문을 수행할 수 있다.
ex_1)
SqlSession session = SqlSessionFactory.openSession();
try {
Hello hello = session.selectOne("org.mybatis.exam.HellpMapper.selectHello",100);
}finally {
session.close();
}
- 주어진 SQL 구문의 파라미터와 리턴 값을 설명하는 인터페이스를 사용하여 문자열 처리 오류나 캐스팅 오류 없이 좀더 타입에 안전하고 깔끔하게 실행 할 수 있다.
ex_2)
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
HelloMapper mapper = sqlSession.getMapper(HelloMapper.class);
Hello hello = mapper.selectHello(100);
}finally {
sqlSession.close();
}
3. Namespaces(네임스페이스)
- 인터페이스 바인딩을 가능하게 하고, 패키지 경로를 포함한 전체 이름을 가진 구문을 구분하기 위해 사용한다.
ex) 아래 방식처럼 xml에 매핑되지 않고 자바 어노테이션을 이용하여 사용할 수 있다.
public interface HelloMapper {
@Select("select msg from hello")
String selecthello();
}
구문은 깔끔하지만 복잡한 구문을 사용한다면 xml매핑을 사용하는 것이 낮다.
4. 스코프와 생명주기
1) SqlSessionFactoryBuilder
- SqlSessionFactoryBuilder는 인스턴스화 되어 사용되고 던져질 수 있고, 사용 후에는 유지할 필요는 없다. 가장 좋은 스코프는 메소드 스코프(메서드 지역변수)이다.
2) SqlSessionFactory
- SqlSessionFactory은 어플리케이션이 실행되는 동안 존재해야하므로, 삭제되거나 재생성 할 필요가 없다.
- 어플리케이션이 실행되는 동안 여러차례 SqlSessionFactory를 다시 빌드하지 하지 않는 것이 좋다.
- SqlSessionFactory를 유지하기 위한 방법은 Singleton, static Singleton 패턴을 이용하거나 아님 static Map에 담아서 사용할 수도 있다.
3) SqlSession
- SqlSession은 공유되지 않고 쓰레드에도 안전하다.
- ststic필드나 클래스의 인스턴스 필드로 지정하면 안된다.
- HttpSession과 같은 관리 스코프에 둬서는 안된다.
- SqlSession을 닫는 것은 중요하므로 finally 블록에서 종료한다.
ex_)
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
4) Mapper 인스턴스
- 매핑된 구문을 바인딩하기 위해 만들어야 할 인터페이스로 SqlSession에서 생성한다.
- 가장 좋은 스코프는 메서드 스코프이다.
- 사용할 메서드가 호출되면 생성되고 끝나므로 명시적으로 닫을 필요 없다.