거꾸로 바라본 세상
반응형

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에서 생성한다.

- 가장 좋은 스코프는 메서드 스코프이다.

- 사용할 메서드가 호출되면 생성되고 끝나므로 명시적으로 닫을 필요 없다.



반응형
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!