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 |
이 구문으로 전달될 파라미터를 위한 전체 클래스 이름이나 별명 |
flushCache |
true로 세팅할 경우, 이 구문이 호출될 때마다 로컬 및 2단계 레벨 캐시가 지워질것이다(flushed). 기본값 : insert, update, delete 구문에 대해 false . |
timeout | 이것은 예외를 던지기 전에 드라이버가 데이터베이스에 대한 요청으로부터 리턴을 기다리는 시간을 설정. 기본값은 unset (드라이버에 의존). |
statementType | STATEMENT, PREPARED 혹은 CALLABLE 중 하나. 마이바티스가 각기 Statement, PreparedStatement 나 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 속성
Attribute | Description |
---|---|
keyProperty | selectKey구문의 결과가 세팅되어져야하는 대상 프라퍼티 |
resultType |
result의 타입. 마이바티스는 일반적으로 이것을 이해할 수 있지만, 추가하더라도 문제가 되지은 않음. 마이바티스는 String 을 포함한 키로 사용될 수 있는 어떠한 간단한 타입이라도 허용 |
order | BEFORE 와 AFTER로 세팅될 수 있음. BEFORE 로 세팅되면 키를 먼저 select 한 후, keyProperty 를 세팅하고, insert구문을 실행함. AFTER 로 세팅되면, insert 구문을 먼저 실행하고, selectKey 구문을 실행함 – 이는 Oracle과 같은 데이터베이스에서 일반적인, insert 구문 내의 embeded sequence 호출같은 방식 |
statementType |
위와 같음, 마이바티스는 각각의statement, PreparedStatement 와 CallableStatement 로 매핑하는 STATEMENT, PREPARED 와 CALLABLE 구문 타입을 지원 |