Spring

"Mapper XML 파일 구문들" (insert, update, delete, select..)

서윤-정 2023. 5. 23. 16:47

동적 SQL 엘리먼트들을 살펴보기 전에 먼저 mapper에 있는 구문들을 확실히 해야 할 것 같아 정리해본다.

마이바티스는 SQL을 작성하는데 집중하도록 만들어졌다고 한다.

 

  • cache -> 해당 네임스페이스를 위한 캐시 설정
  • cache-ref -> 다른 네임스페이스의 캐시 설정에 대한 참조
  • resultMap -> 데이터베이스 결과 데이터를 객체에 로드하는 방법을 정의하는 엘리먼트
  • parameterMap -> 비권장한다. 예전에 파라미터를 매핑하기 위해 사용되었으나 현재는 사용하지 않는다.
  • sql -> 다른 구문에서 재사용하기 위한 SQL 조각
  • insert -> 매핑된 INSERT 구문
  • update -> 매핑된 UPDATE 구문
  • delete -> 매핑된 DELETE 구문
  • select -> 매핑된 SELECT 구문

 

각각에 대해 세부적으로 살펴보자.

 

 

 

- select

가장 흔히 사용되는 엘리먼트다. 

데이터베이스에서 데이터를 가져온다. 조회하는 기능을 수행한다.

 

--> 주어진 ID에 해당하는 개인정보를 선택하는 쿼리이다.

주어진 id에 해당하는 개인정보를 "PERSON" 테이블에서 선택하여 'hashmap'으로 반환한다.

이 구문의 이름은 selectPerson이고 int타입의 파라미터를 가진다. 

그리고 결과 데이터는 HashMap에 저장된다.

(hashmap은 키-값 쌍으로 데이터를 저장하는 자료구조이다.)

(개인정보의 각 열은 'hashmap'의 키-값 쌍으로 매핑된다.)

<select id="selectPerson" parameterType="int" resultType="hashmap">
	SELECT * FROM PERSON WHERE ID = #{id}
</select>

 

--> select 엘리먼트 속성들

  • id - 구문을 찾기 위해 사용될 수 있는 네임스페이스 내 유일한 구분자
  • parameterType - 구문에 전달될 파라미터의 패키지 경로를 포함한 전체 클래스명이나 별칭
  • resultType - 이 구문에 의해 리턴되는 기대 타입의 패키지 경로를 포함한 전체 클래스명이나 별칭
  • resultMap - 외부 resultMap 의 참조명

이 밖에도 요런 속성들이 있다...

 

 

 

 

- insert, update, delete

데이터를 변경하는 구문들이다.

<insert id="insertAuthor">
  insert into Author (id,username,password,email,bio)
  values (#{id},#{username},#{password},#{email},#{bio})
</insert>

<update id="updateAuthor">
  update Author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
  where id = #{id}
</update>

<delete id="deleteAuthor">
  delete from Author where id = #{id}
</delete>

 

--> insert, update, delete 엘리먼트 속성들...

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

<update
  id="updateAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

<delete
  id="deleteAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

 

--> insert는 key 생성과 같은 기능을 위해 몇가지 추가 속성과 하위 엘리먼트를 가진다.

 

--> Author 테이블에 새 작성자를 삽입하는 쿼리다.

-- useGeneratedKeys="true"는 자동 생성된 키를 사용하도록 설정한다.

이 설정을 사용하면 새로 삽입된 레코드의 생성된 키 값을 가져올 수 있다.

-- keyProperty="id"는 자동 생성된 키 값을 어떤 속성에 매핑할 것인지를 지정한다.

이 경우엔 id 속성에 자동 생성된 키 값을 매핑한다.

(자동 생성된 키란 데이터베이스에서 자동으로 생성되는 고유한 값이다.

주로 데이터베이스의 데이블에 새로운 레코드를 삽입할 때 사용되며

자동 생성된 키는 테이블의 기본키(PK)열에 해당되며 각 레코드를 고유하게 식별하는 역할을 한다.)

(자동 생성된 키는 주로 정수 값이며 데이터베이스 시스템이 자체적으로 생성하거나 관리한다. 

데이터베이스의 효율적인 관리와 데이터 무결성을 보장하는데 도움이 된다.)

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>

 

 

--> <foreach> 태그는 주어진 목록(collection)의 각 항목에 대해 반복 작업을 수행한다.

  • collection="list"는 "list"라는 파라미터에 전달된 목록을 나타낸다.
  • item="item"은 각 항목을 "item"이라는 변수에 할당한다.
  • separator=","는 각 삽입 구문 사이에 ","를 삽입하여 구분한다.
<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

 

 

 

--> <selectKey> 태그는 자동 생성된 키를 얻기 위한 서브쿼리를 정의한다.

이 서브쿼리는 'SYSIBM.SYSDUMMY1' 시스템 테이블을 사용하여 랜덤한 6자리 숫자를 생성한다.

그리고 이 값을 id라는 속성에 매핑하여 반환한다.

  • 'keyProperty="id"는 자동 생성된 키 값을 id 속성에 매핑한다.
  • resultType="int"는 자동 생성된 키의 데이터 타입을 int로 지정한다.
  • order="BEFORE"는 삽입 작업 전에 서브쿼리를 실행하도록 지정한다.

favouriteSection,jdbcType=VARCHAR 는 'favouriteSection' 파라미터의 JDBC 데이터 타입을 

명시적으로 VARCHAR로 지정한다.

<insert id="insertAuthor">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  </selectKey>
  insert into Author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>

 

 

--> selectKey 엘리먼트는 다음처럼 설정 가능하다.

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">

 

 

--> selectKey 엘리먼트 속성들..