305. 파라미터 ( Parameters )

2012. 5. 9. 10:33공부/MYBATIS

지금까지 단순한 파라미터들을 가진 구문들의 예제를 보았어. 마이바티스에서 파라미터는 매우 강력한  요소야. 단순한 상황에서 거의 90% 이상의 경우, 간단한 파라미터들로 충분해. 예를들면,

<select id="selectUsers" parameterType="int" resultType="User">
  select id, username, password
  from users
  where id = #{id}
</select>

위 예제는 매우 간단한 명명된 파라미터 매핑을 보여주고 있어. 파라미터 타입은 'int' 로 세팅되었고, 그래서 파라미터 이름은 아무렇게나 해도 돼. 원시타입이나, 'Integer', 'String' 같은 데이터 타입들은 연관된 파라퍼티를 갖고 있지 않아. 그러므로 파라미터의 전체 값을 대체하게 돼. 하지만 복잡한 객체를 전달한다면, 좀 다르게 해야해. 예를 들면,

<insert id="insertUser" parameterType="User" >
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>

User 타입의 파라미터 객체가 저 구문으로 전달되면, id, username, password 프라퍼티가 찾아질 것이고, 그 값들이 PreparedStatement 의 파라미터로 전달될거야.

구문으로 파라미터를 전달하는 꽤 간단하고 나이스한 방법이야. 하지만 파라미터 매핑의 다양한 특징들이 있어.

먼저 마이바티스의 다른 부분처럼, 파라미터들은 좀 더 구체적인 데이터 타입을 기술할 수 있어.

#{property,javaType=int,jdbcType=NUMERIC}

마이바티스의 나머지부분에서처럼, 자바 타입은 객체가 Hashmap 이 아닌 이상, 거의 언제나 파라미터 객체로부터 결정될 수 있어. 그리고 나서, 자바타입은 정확한 TypeHandler가 사용되어지는지 확신하기 위해 구체적으로 명시되어야 해

NOTE  null 이 값으로 전달된다면, 모든 null이 가능한 컬럼들을 위해 JDBC 타입이 JDBC 에 의해 필요해. JavaDocs 의 PreparedStatement.setNull() 을 읽어보면 너 스스로 이것을 검사할 수 있어.

사용자에 의해 정의된 타입 핸들링을 위해, 특정 TypeHandler 클래스를 명시해해야 해. 예를 들면,

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

벌써부터 장황하게 보이지만, 사실 이렇게 쓸 일은 거의 없다.

숫자타입을 위해 이미, 얼마나 많은 개수가 유효한지 정의하는 numericeSacle 이 있다.

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

마지막으로, mode 속성은 IN, OUT 혹은 INOUT 파라미터들을 명시하는 것을 허락한다. 파마리터가 IN 혹은 INOUT 이라면, 파라미터 객체 프라퍼티의 실제 값은 너가 기대하는 것처럼 바뀔것이다. if you were calling for an output parameter. mode=OUT(or INOUT)이고, jdbcType=CURSOR(즉,오라클 REFCURSOR)이라면, 파라미터의 타입의로 ResultSet을 매핑하기 위해 resultMap을 명시해야 한다. 여기서 javaType 속성은 옵션이라는 것을 기억하고, 만약 jdbcType으로서의 CURSOR가 있는 왼쪽공백(left blank)이라면, 이것은 자동적으로 ResultSet으로 세팅될 것이다.

#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}

마이바티스는 또한 structs와 같은 더 진화된 데이터타입을 지원하지만, out 파라미터를 등록할 때, 반드시 구문에 타입 이름을 얘기해줘야 한다. 예를 들면 ( 연습할 때 아래 예는 한 라인에 써라 )

#{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=departmentResultMap}

이 모든 강력한 옵션들에도 불구하고, 대부분 간단하게 프라퍼티 이름을 명시할 것이고, 마이바티스는 나머지 부분들을 이해할 것이다. 최대한,  null 이 가능한 컬럼들을 위해 jdbcType을 명시할 것이다.

#{firstName}
#{middleInitial,jdbcType=VARCHAR}
#{lastName}