Using the MyBatis API

마이바티스 스프링 연동모듈을 사용해더라도 마이바티스 API를 직접 사용할 수 있다. SqlSessionFactoryBean을 사용해서 스프링에서 SqlSessionFactory를 생성하고 팩토리를 사용하자.

public class UserMapperSqlSessionImpl implements UserMapper {
  // SqlSessionFactory would normally be set by SqlSessionDaoSupport
  private SqlSessionFactory sqlSessionFactory;

  public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
  }

  public User getUser(String userId) {
    // note standard MyBatis API usage - opening and closing the session manually
    SqlSession session = sqlSessionFactory.openSession();

    try {
      return (User) session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
    } finally {
      session.close();
    }
  }
}

이 방법은 신중히 사용하자. 왜냐하면 잘못사용하면 런타임 에러나 데이터 문제등을 야기할수 있기 때문이다. API를 직접 사용할때는 다음의 규칙들에 유의해야 한다.

  • 스프링 트랜잭션에 속할지 않고 별도의 트랜잭션에서 동작한다.

  • SqlSession이 스프링 트랜잭션 관리자가 사용하는 DataSource를 사용하고 이미 트랜잭션이 동작하고 있다면 이 코드는 예외를 발생시킬것이다.

  • 마이바티스의 DefaultSqlSession은 쓰레드에 안전하지 않다. 빈에 이 객체를 주입하면 아마도 에러를 발생시킬수있다.

  • DefaultSqlSession을 사용해서 생성한 매퍼 또한 쓰레드에 안전하지 않다. 이렇게 만든 매퍼를 빈에 주입하면 에러를 발생시킬수있다.

  • SqlSession항상 마지막에 닫아주는 것을 확인해야 한다.