[spring/mybatis] 오라클(oracle) 프로시저(procedure) 파라미터가 배열(array)일 경우 mybatis typehandler 예제

By | 12월 28, 2023

oracle type object

CREATE OR REPLACE TYPE 스키마."VARR" IS TABLE OF VARCHAR2(2048);


TypeHandler

import oracle.jdbc.Oracleconnection;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType

public class VarrTypeHandler extends BaseTypeHandler<Object> {

    /**
     * DB에서 관리중인 Type의 이름
     *  - DB에 이 이름으로 Type Object가 미리 준비되어 있어야 함.
     */
    private static final String TYPE_NAME = "VARR";

    /**
     * 최초 구현하지 않았던 메서드
     * setNonNullParameter()의 태생적 한계(null 파라미터 처리 불가)로 인해 최종적으로 이 메서드를 사용하게 되었음.
     */
    @Override
    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        log.debug("## VarrTypeHandler.setParameter({}) called!", parameter);
        try{
            OracleConnection conn = ps.getConnection().unwrap(OracleConnection.class);
            String[] arrayValues = parameter != null ? (String[]) parameter : null;
            Array array = conn.createOracleArray(TYPE_NAME, arrayValues);
            ps.setArray(i, array);

        }catch(SQLException ex){
            log.error("## VarrTypeHandler Exception", ex);
        }
    }

    /**
     * 최초 이 메서드에 파라미터 바인딩 기능을 구현했으나, array parameter가 null일 경우에 대한 처리를 할 수 없어서 결국 setParameter() 에 구현함.
     * setParameter() 를 구현한 시점에서 이 메서드는 호출되지 않으나, interface상 필수 메서드라서 override 함.
     */
     @Override
     public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        log.debug("## VarrTypeHandler.setNonNullParameter({}) called!", parameter);
     }

    @Override
    public List<Map<String, Object>> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        log.debug("## VarrTypeHandler.getNullableResult 1 called!");
        return null;
    }

    @Override
    public List<Map<String, Object>> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        log.debug("## VarrTypeHandler.getNullableResult 2 called!");
        return null;
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        log.debug("## VarrTypeHandler.getNullableResult 3 called!");
        return null;
    }

}


mybatis config

<typeAliases>
...
    <typeAlias alias="varrTypeHandler" type="[패키지경로].varrTypeHandler" />
</typeAliases>


mybatis query xml

<parameterMap id="procedure01PMap" type="map">
    ...
    <parameter property="[변수명]" typeHandler="varrTypeHandler" mode="IN" />
    ...
</parameterMap>

<update id="procedure01" statementType="CALLABLE" parameterMap="procedure01PMap">
    { ? = call PKG01.PROC01( ?, ?, ? ) }
</update>
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments