개발/Framework

[MyBatis] INSERT문 / SELECT문 + resultMap xml파일 작성법

하더 2022. 12. 18. 22:49

< MyBatis - INSERT >

 

[ 표현법 ]

<insert id="각 sql문의 식별자" parameterType="전달받을 자바 타입(풀클래스명) 혹은 별칭">
    쿼리문 작성
</insert>

 

=> parameterType속성은 전달받을 값이 없다면 생략 가능

=> PreparedStatement객체에서 사용하던 ?(위치홀더)대신 

     parameterType에 전달한 클래스의 필드명 또는 값을 #{  } 안에 넣음

     (객체의 경우 내부적으로 getter를 호출해서 필드에서 값을 가져옴)

 

* 예시) 

<insert id="insert">
    insert into users (id, name, funkyNumber, roundingMode) values (
        #{id}, #{name}, #{funkyNumber}, #{roundingMode}
    )
</insert>

 

 

 

< MyBatis - SELECT >

 

* SELECT SQL문

 

[ 표현법 ]

<select id="각 sql문의 식별자" parameterType="전달받을 자바 타입(풀클래스명) 혹은 별칭"
  resultType="조회결과를 반환하고자 하는 자바타입" 또는 resultMap="조회결과를 뽑아서 매핑할 resultMap의 id">
    쿼리문 작성
</select>

=> parameterType속성은 전달받을 값이 없다면 생략이 가능하다.
=> 반드시 resultType 또는 resultMap으로 결과에 대한 타입을 지정해야 함

     (SELECT문의 결과는 항상 어떤 SELECT문이냐에 따라서 다를 수 있기 때문)

> resultType : 자바에서 제공하는 자료형 지정

> resultMap : 내가 만든 VO 클래스 타입 지정

 

 

* resultMap

resultMap엘리먼트는 마이바티스에서 가장 중요하고 강력한 엘리먼트이다. ResultSet에서 데이터를 가져올때 작성되는 JDBC코드를 대부분 줄여주는 역할을 담당한다. 사실 join매핑과 같은 복잡한 코드는 굉장히 많은 코드가 필요하다. ResultMap은 간단한 구문에서는 매핑이 필요하지 않고 복잡한 구문에서 관계를 서술하기 위해 필요하다.

- 마이바티스의 핵심 기능 중 하나

- ResultSet으로부터 조회된 컬럼 값을 하나씩 뽑아서 지정한 VO객체의 각 필드에 담는 역할 수행

 

[ 표현법 ]
<resultMap id="식별자" type="조회된결과를담아서 반환하고자 하는 VO객체의 타입(풀클래스명) 또는 별칭">
    <result column="조회결과를 뽑고자 하는 DB컬럼명" property="해당 결과를 담고자 하는 필드명" />
    <result column="조회결과를 뽑고자 하는 DB컬럼명" property="해당 결과를 담고자 하는 필드명" />
    ...
</resultMap>

 

* 예시)

간단한 SELECT문의 경우, 직접 작성한 VO라 하더라도 resultType을 사용할 수 있다.

이 경우 마이바티스는 칼럼을 자바빈에 이름 기준으로 매핑하여 ResultMap을 자동으로 생성할 것이다.
<!-- TypeAliases를 사용하면 타이핑 수를 줄일 수 있음 -->

<!-- XML설정파일에서 -->
<typeAlias type="com.someapp.model.User" alias="User"/>

<!-- SQL매핑 XML파일에서 -->
<select id="selectUsers" resultType="User">
  select id, username, hashedPassword
  from some_table
  where id = #{id}
</select>



<!-- 칼럼명이 프로퍼티명과 다르다면 SQL구문에 별칭을 지정가능 -->
<select id="selectUsers" resultType="User">
  select
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
  from some_table
  where id = #{id}
</select>

 

* 예시) resultMap 사용

<!-- resultMap은 대체로 mapper파일 상단에 작성 -->
<resultMap id="boardResultSet" type="board">
    <result column="BOARD_NO" property="boardNo" />
    <result column="BOARD_TITLE" property="boardTitle" />
    <result column="USER_ID" property="boardWriter" />
    <result column="COUNT" property="count" />
    <result column="CREATE_DATE" property="createDate" />
    <result column="BOARD_CONTENT" property="boardContent" />
    <!-- 해당하지 않는 컬럼을 추가한다고해도, sql문에서 컬럼을 찾지 않으면 문제가 발생하지 않음 -->
</resultMap>

<!-- 해당하는 resultMap의 id를 작성 -->
<select id="selectBoard" parameterType="_int" resultMap="boardResultSet">
    SELECT 
           BOARD_NO,
           BOARD_TITLE,
           USER_ID,
           COUNT,
           CREATE_DATE,
           BOARD_CONTENT
      FROM
           BOARD B
      JOIN
           MEMBER ON(BOARD_WRITER = USER_NO)
     WHERE
           BOARD_NO = #{ boardNo }
       AND
           B.STATUS = 'Y'
</select>

 

 

 

** 참고 : parameterType에 자바 기본변수 형 작성 시, 지정된 별칭이 있음

https://mybatis.org/mybatis-3/ko/configuration.html [참고]