Mybatis

개요

ORM의 일종, Mybatis를 이용하면 리포지토리가 DB에 종속적이게 되지 않아 DB를 변경하더라도 그대로 사용이 가능하다.

Mybatis 사용

	<!--root-context.xml-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!--스캔할 경로 설정-->
		<property name="mapperLocations" value="classpath:mapper/**/*.xml"/>
	</bean>
<!--Mybatis를 사용하는 경우 인터페이스만 만들고 구현 클래스를 만들 필요가 없다-->
<!--SQL구문에서 SQL developer에서 처럼 ;을 붙이지 말자-->
<mapper namespace="리포지토리 인터페이스">
    <!--Param 어노테이션이 있기에 parameterType은 생략하는 것이 좋다.-->
	<select id="메소드명" parameterType="파라미터타입" resultType="반환타입">
		SELECT COUNT(*) FROM TABLE
		<if test="조건식">
			<!--넘어온 파라미터는 #{파라미터명}으로 사용할 수 있다.-->
			 WHERE ID = #{파라미터}
		</if>
	</select>
	<resultMap id="map" type="모델 클래스">
		<result property="필드명" column="컬럼명" />

	</resultMap>
	
	<!--update,delete,insert도 같은 형식-->
    <!--컬럼명과 VO의 변수명이 같으면 자동으로 Setter를 호출해준다.-->
	<select id="메소드명" resultMap="map">
		SELECT * FROM TABLE
	</select>
</mapper>
<!--sql구문을 재사용하기 위해서는 sql 태그를 사용한다.-->
//구현체가 존재하지 않는다.
public interface IEmpRepository {
	int getCount();
	int getCount(int id);
	List<VO> getList();
	VO getInfo(int id);
	void updateVO(VO vo);
	void insertVO(VO vo);
	int deleteEmp(@Param("id") int id, @Param("email") String email);
	List<Map<String, Object>> getAll();
}

동적 SQL

JSTL과 비슷한 문법으로 if, choose, when, else를 제공하고, 추가로 where문과 set문을 작성해주는 where, set 태그를 지원한다. 그외 trim, foreach를 지원.

Mybatis에서 CDATA 사용 이유

<![CDATA[쿼리문]]>에서의 쿼리문은 문자열로 그대로 치환된다. 즉 부등호를 사용해도 태그 괄호로 인식하지 않는다.