Mybatis는 SqlMap.xml 파일에 등록된 각 sql 명령어들을 Map 구조로 저장하여 관리한다. 각 SQL 명령어는 고유한 아디값을 가지고 있으므로 특정아이디로 등록된 SQL을 실행할 수있다. 그리고 SQL이 실행될때 필요한 값들은 input 형태의 데이터로 할당하고 , 실행된 SQL이 SELECT 구문일때는 output 형태의 데이터로 리턴한다.
Mapper XML 파일 구조
Mybatis 프레임워크에서 가장 중요한 파일은 SQL 명령어들이 저장되는
SQL Mapper XML (이후 Mapper로 통칭) 파일이다.
Mapper는<mapper>를 루트 엘리먼트로 가지는 XML파일이면
다음과 같은 기본 구조를 가진다
Mapper 파일의 구조를 보면 가장 먼저 DTD선언이 등장하고 , 그밑에 <mapper>루트 엘리먼트가 선언된다. <mapper>엘리먼트는 namespace 속성을 가지는데,
이 네임스페이스를 이용하여 더 쉽게 유일한 SQL 아이디를 만들 수있다.
네임스페이스가 지정된 Mapper의 SQL 을 DAO 클래스에서 참조할때는 다음과 같이 네임 스페이스와 SQL의 아이디를 결합하여 참조해야한다.
Mapper 파일에 SQL 명령어들을 등록할 때는 SQL 구문의 종류에 따라 적절한 엘리먼트를 사용한다. INSERT 구문은 <insert>엘리먼트를 , SELECT구문은<select>엘리먼트를 사용하는 식이다. 이때 , 각 엘리먼트에서 사용할 수 있는 속성들이 다르므로 그 의미와 용도를 이해해야 한다.
<select> 엘리먼트
<select> 엘리먼트는 데이터를 조회하는 SELECT 구문을 작성할 때 사용한다.
parameterType과 resultType 속성을 사용할 수 있다.
(1)id 속성
<select> 엘리먼트에 선언된 id 속성은 필수속성으로 Mapper 파일들 내에서 유일한 아이디를 등록해야한다. 그래야 나중에 DAO 클래스에서 특정 아이디로 등록된 SQL을 실행 할 수 있다 . 이 id 속성과 관련하여 살펴볼 것이 루트 엘리먼트인 <mppaer>이다.
<mapper> 엘리먼트 안에서 선언된 여러 아이디를 하나의 네임 스페이스로 묶을수 있다.
예를 들어 , 다음 두 파일에 선언된 “getTotalCount”라는 아이디는 네임 스페이스가 다르므로 다른 아이디로 처리 될 수있다.
(2)parameterType 속성
Mapper 파일에 등록된 SQL을 실행하려면 SQL에 실행에 필요한 데이터를 외부로 부터 받아야한다. 이때 사용하는 속성이 parameterType 속성이다. paramerterType 은 일반적으로 기본형이나 VO형태 클래스를 사용한다.
이때 Mybatis 메인 설정파일(sql-map-config.xml)에 등록된<typeAlias>의 Alias를 사용하면 설정을 더 간결하게 처리할 수 있다.
▲메인 설정파일(sql-map-config.xml)에 등록된<typeAlias>의 Alias
▲sql-mapper.xml에 paramtype에 클래스명전부가아닌“board”만 사용
parameterType으로 지정된 클래스에는 사용자가 입력한 값들을 저장할 여러변수가 있다.
변수들을 이용하여 SQL 구문에 사용자 입력값들을 설정하는데, 이때 ‘#{변수명}’표현을 사용한다. 그리고 중요한건 parameterType 속성은 생략 할수 있으면 대부분 생략한다.
(3) resultType 속성
기본적으로 위와 같다
<select> 엘리먼트에서 사용가능하며 생략할수 없는 속성이다 다만 resultType속성대신 나중에 살펴볼 resutlMap 속성을 사용할수는 있다.
SQL Mapper XML 추가 설정
검색결과를 특정 자바 객체에 매핑하여 리턴하기 위해서 parameterType속성을 사용한다. 그러나 검색 결과를 parameterType 속성으로 매핑 할수 없는 몇몇사례가 있다. 예를 들어 , 검색쿼리 단순 테이블 조회가 아닌 JOIN 구문을 포함할때 는 검색 결과를 정확하게 하나의 자바 객체로 매핑할 수 없다.
또는 검색된 테이블의 칼럼 이름과 매핑에 사용될 자바객체 변수 이름이 다를때에 검색결과가 정확하게 자바객체로 매핑되지 않는다. 이럴때 resultMap 속성을 사용하여 처리하면 된다.
위 설정에는 boardRsult라는 아이디로 <resultMap>을 설정했다. <resultMap> 설정 PK(Primary Key)에 해당하는 SEQ칼럼만 <id> 엘리먼트를 사용했고 , 나머지는
<rsult>엘리먼트를 이용하여 검색 결과로 얻어낸 칼럼의 값과 Board VO객체의 변수를 매핑 하고 있다 . 이렇게 설정된 <resultMap>을 getBoardList로 등록된 쿼리에서 resultMap 속성으로 참조 하고 잇다.