동적 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 엘리먼트 속성들..
'Spring' 카테고리의 다른 글
Apache Maven 란? (POM) (0) | 2023.08.18 |
---|---|
Spring MVC 란? (주요 컴포넌트, 요청 처리 과정, 프로젝트 폴더 구조) (0) | 2023.08.17 |
Spring Framework 란? (구성 요소, 모듈과 동작 구조) (0) | 2023.08.17 |
프레임워크(Framework)란? (라이브러리(Library)와 차이점) (0) | 2023.08.17 |
흔히 사용되는 이스케이프 문자들 (0) | 2023.08.07 |