본문 바로가기
Today I learned

Spring with Oracle 쿼리 연동

by soheemon 2019. 3. 19.

mybatis를 spring과 함께 사용하려면 spring의 app-context에 적어도 두개를 정의해야함

1)SqlSessionFactory

2)한개 이상의 Mapper Interface


-SqlSessionFactoryBean은 SqlSessionFactory를 만들기 위해 사용된다.


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

 <property name="dataSource" ref="dataSource" />

</bean>

SqlSessionFactory는 Data Source를 필요로 한다.


Mapper InterFace가 다음과 같이 정의되어 있을때

public interface UserMapper {

 @Select("SELECT * FROM users WHERE id = #{userId}")

 User getUser(@Param("userId") String userId);

}

UserMapper인터페이스는 다음처럼 Mapper FactoryBean을 사용해서 Spring에 추가된다.


2)Mapper InterFace설정

MpperFactoryBean

Mapper는 반드시 구현체 클래스가 아닌 인터페이스로 정의되어야 한다.

-한번만 설정하면 다른 스프링빈에 주입하는 같은 방법으로 비즈니스/서비스 객체에 Mapper를 직접 주입 할 수 있다.

-MapperFactoryBean은 SqlSession을 생성하고 닫는 작업을 잘 다룬다.

실행중인 스프링 트랜잭션이 있따면, 트랜잭션이 완료된느 시점에 커밋이나 롤백이 될것이다.


<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

 <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />

 <property name="sqlSessionFactory" ref="sqlSessionFactory" />

</bean>


-실제 호출부


public class FooServiceImpl implements FooService {


private UserMapper userMapper;


public void setUserMapper(UserMapper userMapper) {

 this.userMapper = userMapper;

}


public User doSomeBusinessStuff(String userId) {

 return this.userMapper.getUser(userId);

}

SqlSessionFactoryBean

-SqlSessionFactory를 생성하기 위함.

Mybatis Srping 연동모듈에서는 SqlSessionFactoryBean를 사용한다.


Factory Bean을 생성하기 위해 Spring xml설정파일에 다음 과같이 설정한다.



<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

 <property name="dataSource" ref="dataSource" />

</bean>

SqlSessionFactoryBean은 스프링의 FactoryBean인터페이스를 구현한다는것을 아아야 한다.

SqlSessionFactoryBean자체를 생성하는것이 아니라, getObject한 결과이다.

이게 뭔말이냐 하면. SqlSessionFactory는 객체를 직접 생성하는것이 아니라, SqlSessionFactoryBean을 먼저 객체 생성후, factoryBean을 getObject해야 객체를 얻는다는 것이다.



실제 사용하는것은 sqlSessionTemplate로,


<mapper namespace="testmp">

<select id ="getSysdate" resultType="String">

select sysdate from dual

</select>

</mapper>


아래와같이, sqlSessionTemplate에서 selectOne을 호출하는데, 이때 인자로 "mapperNamespace.QuaryMethod명"을 입력한다.

String date2 = sqlSessionTemplate.selectOne("testmp.getSysdate");



댓글