Mapper Xml

EUNJI LEE·2023년 7월 5일
0

MyBatis

목록 보기
2/6
post-custom-banner

Mapper

MyBatis Mapper Xml은 MyBatis에서 사용할 sql문을 작성해둔 파일로 프로젝트에서 실행할 sql문을 다양한 태그를 이용해서 선언한다. sql문 결과를 저장할 객체를 설정할 수도 있다.

파일명에 대한 명확한 규칙이 존재하지 않지만 구분을 위해 mappers 폴더 안에 프로젝트명-mapper.xml 로 구분해줬다. config.xml의 mappers 태그 안에 작성한 경로, 파일명과 잘 일치하는지 확인만 해주면 된다.

DOCTYPE

xml 최상단에 xml 형식을 지정해서 해당 xml 파일이 MyBatis mapper 설정이라는 선언을 해줘야 한다.

<?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>

mapper 태그 내부에 다른 태그들을 작성하고 해당 태그의 namespace 속성에는 mapper를 지칭하는 이름을 작성한다. namespace값은 session 객체가 sql문을 메소드에 의해서 실행할 때 사용하는 mapper 구분 값이다.

<mapper namespace="student">
	<!-- 
	실행할 sql문에 맞는 태그를 선언하면 된다.
	<select>, <insert>, <update>, <delete>
	sql문은 시작 태그와 끝 태그 사이에 작성하고 세미콜론(;)은 사용하지 않는다.
	 -->
</mapper>

<resultMap>

vo객체와 resultSet에 컬럼명이 불일치할 때 resultMap을 이용해서 매핑할 수 있다. resultMap을 사용하면 조회한 결과를 원하는 객체의 필드에 담아서 반환할 수 있게 된다.

resultMap 태그의 id 속성은 resultMap을 사용할 때 구분자로서 역할을 하고 type은 Java에서 제공하는 객체가 아닌 경우 패키지명을 포함해서 사용할 객체의 클래스명을 작성해주어야 한다.

<id> : PK가 되는 컬럼을 매핑시킬 때 사용한다.

<result> : PK가 아닌 일반 컬럼을 매핑시킬 때 사용한다.

property 속성 값으로는 매핑시킬 필드명을 작성하고 column 속성 값으로는 조회한 ResultSet의 컬럼명을 작성한다.

<resultMap id="studentMap" type="com.mybatis.model.vo.Student">
	  	<id property="studentNo" column="student_no"/>
	  	<result property="studentName" column="student_name"/>
	  	<result property="studentTel" column="student_tel"/>
	  	<result property="studentEmail" column="student_email"/>
	  	<result property="studentAddress" column="student_addr"/>
</resultMap>

<select>

sql의 select문을 사용할 때 사용되는 태그이다. id 속성은 해당 구문을 구분하는 구분자 역할을 하고 파라미터 값을 넘겨주게 되면 parameterType 속성 값에 파라미터의 자료형을 작성해준다.

파라미터 값을 받을 땐, #{전달 받은 변수명} 을 sql문의 필요한 위치에 넣는다. #{ }?와 같은 위치홀더 역할을 한다.

resultType 속성 값으로는 반환 값의 자료형을 작성한다. 만약 resultMap 태그로 매핑한 객체로 전달하려면 resultType 대신 resultMap 속성 값에 매핑한 id를 작성해준다.

<!-- 매핑한 resultMap을 사용할 때 -->
<select id="selectStudentAll" resultMap="studentMap">
	 	SELECT * FROM STUDENT
</select>
<!-- 기본 자료형으로 받을 때 -->
<select id="selectStudentCount" resultType="_int">
	 	SELECT COUNT(*) FROM STUDENT
</select>
<!-- 파라미터 값을 받아서 조회할 때 -->
<select id="selectStudent" parameterType="_int" resultMap="studentMap">
	 	SELECT *
	 	FROM STUDENT WHERE STUDENT_NO=#{no}
</select>

✅ properties 파일에 작성할 때처럼 세미콜론(;)은 작성하지 않지만, properties 파일과 다르게 여러 줄로 개행 해서 사용해도 에러가 발생하지 않는다.

💡 MyBatis Type?
MyBatis에서 paramertType, resultType을 작성할 때는 MyBatis가 지정해둔 내장 별칭을 이용해야 한다. Java에서 제공하는 기본 자료형은 앞에 언더바(_)가 붙고 아닌 경우 전부 소문자로 작성한다는 규칙이 있다.

<insert>,<update>,<delete>

해당 태그들은 동일한 설정을 갖는다. DML의 실행 결과는 무조건 int형으로 반환하므로 해당 태그에 반환 타입은 따로 지정하지 않는다.

id 속성 값은 마찬가지로 해당 sql문을 구분할 수 있는 구분자 역할을 한다. parameterType도 select 태그와 동일하게 사용한다.

그 외에도 구문이 호출될 때마다 캐시 값을 지울지 말지 설정할 수 있는 flushCache 태그나 예외가 발생하기 전에 DB의 요청 결과를 기다리는 최대 시간을 설정하는 timeout 태그 등 다른 속성들도 존재한다.

<insert id="insertStudentAll" parameterType="com.mybatis.model.vo.Student">
	 	INSERT INTO STUDENT 
		VALUES(SEQ_STUDENT.NEXTVAL,#{studentName},#{studentTel},
			#{studentEmail},#{studentAddress},DEFAULT)
</insert> 
<update id="updateStudent" parameterType="com.mybatis.model.vo.Student">
	 	UPDATE STUDENT SET STUDENT_NAME=#{studentName},
		STUDENT_TEL=#{studentTel},STUDENT_EMAIL=#{studentEmail},
		STUDENT_ADDR=#{studentAddress}
	 	WHERE STUDENT_NO=#{studentNo}
</update>
<delete id="deleteStudent" parameterType="_int">
	 	DELETE FROM STUDENT WHERE STUDENT_NO=#{no}
</delete>
profile
천천히 기록해보는 비비로그
post-custom-banner

0개의 댓글