303. insert, update and delete

2012. 4. 27. 15:49공부/MYBATIS

데이터 수정 구문인 insert, update 와 delete 는 그들의 구현체와 매우 비슷해.

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

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

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

Insert, Update and Delete 속성

속성

설명
id

구문을 참조하기 위해 사용될 수 있는 이 네임스페이스의 유일한 구분자 

parameterType

이 구문으로 전달될 파라미터를 위한 전체 클래스 이름이나 별명

parameterMapThis is a deprecated approach to referencing an external parameterMap. Use inline parameter mappings and the parameterType attribute.
flushCache

true로 세팅할 경우, 이 구문이 호출될 때마다 로컬 및 2단계 레벨 캐시가 지워질것이다(flushed). 기본값 : insert, update, delete 구문에 대해 false .

timeout 이것은 예외를 던지기 전에 드라이버가 데이터베이스에 대한 요청으로부터 리턴을 기다리는 시간을 설정. 기본값은 unset (드라이버에 의존).
statementType STATEMENTPREPARED 혹은 CALLABLE  중 하나. 마이바티스가 각기 StatementPreparedStatement 나 CallableStatement 사용하도록 함. 기본값: PREPARED.
useGeneratedKeys(insert 만) 데이터베이스에 의해 내부적으로 생성된 키를 추적하기 위해 JDBC getGeneratedKeys를 사용할 것을 마이바티스에게 알림 (예. MYSQL이나 SQL Server 같은 관계형데이터베이스의 자동증가 필드 ) 기본값: false
keyProperty

(insert 만) insert 구문의 자식요소인 selectKey 나   getGeneratedKeys 에 의해 리턴된 키값을 어느 프라퍼티에 마이바티스가 세팅할 것인지 확인. 기본값 : unset.

keyColumn

(insert 만) generated key를 가진 테이블의 컬럼 이름을 세팅. 이것은 키 컬럼이 테이블의 첫번째 컬럼이 아닐 경우, PostgreSQL같은 특정 데이터베이스들에게만 필요함 

다음은 insert, update 그리고 delete 구문의 예제야.

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

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

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

언급된대로, insert 는 다양한 방법으로 키 생성을 허용하는 부가 요소와 몇 개의 추가 요소를 가지고 있어.

먼저, 데이터베이스가 자동 증가 필드를 지원한다면 ( 예를 들면 MYSQL이나 SQL Server 같은 ) 간단히  useGeneratedKeys="true" 로 세팅하고, keyProperty 를 타겟 프라퍼티로 세팅하는게 다야. 예를 들면, 위의 Author 테이블이 id 에 대해 자동증가필드 타입을 사용했다면, 구문은 다음처럼 수정될거야.      

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

마이바티스 자동증가컬럼 타입을 지원하지 않는 데이터베이스나, 자동증가 키를 지원하는 JDBC 드라이버를 아직 지원하지 않는 경우에 키 생성을 다루는 다른 방법이 있어.

여기 랜덤 ID를 생성하는 간단한(어리석은) 예가 있어 ( 결코 네가 이렇게 하지는 않겠지만, 이 도식은 편리함과  마이바티스가 진짜 얼마나 신경쓰지 않는지를 보여주지 )

<insert id="insertAuthor" parameterType="domain.blog.Author">
  <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 구문이 처음 실행될 것이고, Authorid 프라퍼티가 세팅될거고, 그 다음에 insert 구문이 호출될거야.  이는 데이터베이싀의 자동생성 키를 위한 비슷한 동작을 복잡한 자바 코드 없이 제공해.                   

selectKey 요소는 다음과 같이 기술되지.

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

selectKey 속성

AttributeDescription
keyProperty selectKey구문의 결과가 세팅되어져야하는 대상 프라퍼티
resultType

result의 타입. 마이바티스는 일반적으로 이것을 이해할 수 있지만, 추가하더라도 문제가 되지은 않음. 마이바티스는 String 을 포함한 키로 사용될 수 있는 어떠한 간단한 타입이라도 허용

order BEFOREAFTER로 세팅될 수 있음. BEFORE 로 세팅되면 키를 먼저 select 한 후, keyProperty 를 세팅하고, insert구문을 실행함. AFTER 로 세팅되면, insert 구문을 먼저 실행하고, selectKey 구문을 실행함 – 이는 Oracle과 같은 데이터베이스에서 일반적인, insert 구문 내의 embeded sequence 호출같은 방식
statementType

위와 같음, 마이바티스는  각각의statement, PreparedStatement CallableStatement 로 매핑하는  STATEMENT, PREPARED CALLABLE 구문 타입을 지원