-
"Mapper XML 파일 구문들" (insert, update, delete, select..)Spring 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 엘리먼트 속성들..
'Spring' 카테고리의 다른 글
Apache Maven 란? (POM) (1) 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