2012-10-04 11 views
7

나는 이것을 잠시 동안 인터넷 검색을 해왔고 어떤 진정한 답변도 찾지 못했습니다.MyBatis를 사용하여 Java 저장 프로 시저를 Java 저장 프로 시저로 전달하는 방법?

테이블 행 유형의 테이블 인 유형의 매개 변수가있는 Oracle 저장 프로 시저가 있습니다. 그래서 예를 들면 다음과 같습니다 pacakge로 선언

:

TYPE param1_type_t IS TABLE OF table1%ROWTYPE; 
TYPE param2_type_t IS TABLE OF table2%ROWTYPE; 
TYPE param3_type_t IS TABLE OF table3%ROWTYPE; 

오라클 절차 : 자바 측면에서

PROCEDURE my_proc 
(
    parameter1 IN param1_type_t, 
    parameter2 IN param2_type_t, 
    parameter3 IN param3_type_t 
) 

, 나는 각을 나타내는 객체의 3 개 해당 목록을 자바로 채워지는 매개 변수. 이 시나리오에서 MyBatis를 사용하여 Oracle 프로 시저를 호출 할 수 있습니까?

<update id="callOracleSP" statementType="CALLABLE"> 
    {CALL my_proc(#{param1, mode=IN}, 
        #{param2, mode=IN}, 
        #{param3, mode=IN} 
       ) 
    } 
</update> 

객체 자체는 문자열과 정수 속성 및 해당 getter 및 setter 간단한 VO로한다.

진행 방법을 잘 모르겠습니다. 어떻게 든 Java 객체 목록을 Oracle 유형에 매핑해야합니까?

미리 감사드립니다.

답변

7

이미 수행했는지 여부는 알 수 없지만 Oracle 객체가 정의되어 있어야합니다.

CREATE OR REPLACE TYPE SCHEMA."YOUR_OBJECT" AS OBJECT 
(
    field_one varchar2(50), 
    field_two varchar2(100) 
); 
/
CREATE OR REPLACE TYPE SCHEMA."YOUR_OBJECT_ARRAY" AS TABLE OF YOUR_OBJECT; 
/

그런 다음 유형 핸들러를 작성하여 Java 오브젝트를 Oracle 오브젝트에 맵핑 할 수 있습니다.

import oracle.sql.ARRAY; 
import oracle.sql.ArrayDescriptor; 
import oracle.sql.STRUCT; 
import oracle.sql.StructDescriptor; 
.... 
public class YourTypeHandler implements TypeHandler 
{ 
.... 
    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException 
    { 
     List<YourObject> objects = (List<YourObject>) parameter; 

     StructDescriptor structDescriptor = StructDescriptor.createDescriptor("YOUR_OBJECT", ps.getConnection()); 

     STRUCT[] structs = new STRUCT[objects.size()]; 
     for (int index = 0; index < objects.size(); index++) 
     { 
      YourObject pack = packs.get(index); 
      Object[] params = new Object[2]; 
      params[0] = pack.getFieldOne(); 
      params[1] = pack.getFieldTwo(); 
      STRUCT struct = new STRUCT(structDescriptor, ps.getConnection(), params); 
      structs[index] = struct; 
     } 

     ArrayDescriptor desc = ArrayDescriptor.createDescriptor("YOUR_OBJECT_ARRAY", ps.getConnection()); 
     ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs); 
     ps.setArray(i, oracleArray); 
    } 
} 

그런 다음

call your_proc 
(
#{yourObjects, javaType=Object, jdbcType=ARRAY, jdbcTypeName=YOUR_OBJECT_ARRAY, mode=IN, typeHandler=YourObjectArrayTypeHandler} 
) 
+0

찾을 수 없습니다 TypeHandler의 클래스/jar 이미 ojdbc6.jar을 가지고 있습니다. – aishu

0

앤디 프라이어의 대답은 내가 그것을 테스트하고 정말 작동 아주 좋은, 프로 시저를 호출. 하지만 typeHandler에 오류가 있습니다

call your_proc 
(
#{yourObjects, javaType=Object, jdbcType=ARRAY, jdbcTypeName=YOUR_OBJECT_ARRAY, mode=IN, typeHandler=YourObjectArrayTypeHandler} 
) 

는해야 다음 TypeHandler뿐만 아니라에 오류가

call your_proc 
(
#{yourObjects, javaType=Object, jdbcType=ARRAY, jdbcTypeName=YOUR_OBJECT_ARRAY, mode=IN, typeHandler=YourTypeHandler} 
) 

: (더 "팩"이없는 및 메소드 매개 변수에 약간의 차이가있다

<parameterMap id="updateHierPersonAssignMap" class="java.util.Map" >      
    <parameter property="p_array" jdbcType="ARRAY" javaType="Object" mode="IN" typeHandler="com.aamtech.ria.model.domain.typehandler.YourTypeHandler"/> 
    </parameterMap> 
    <procedure id="updateHierPersonAssign" parameterMap="updateHierPersonAssignMap" > 
    <![CDATA[ 
     { call ria_am_util_pkg.j_update_hier_person_assign(?) } 
    ]]> 
    </procedure> 
: 내 버전) 여기

@Override 
public void setParameter(PreparedStatement ps, int i, Object parameter, String arg3) throws SQLException { 
    List<YourObject> objects = (List<YourObject>) parameter; 

    StructDescriptor structDescriptor = StructDescriptor.createDescriptor("YOUR_OBJECT", ps.getConnection()); 

    STRUCT[] structs = new STRUCT[objects.size()]; 
    for (int index = 0; index < objects.size(); index++) 
    { 
     YourObject pack = objects.get(index); 
     Object[] params = new Object[2]; 
     params[0] = pack.getFieldOne(); 
     params[1] = pack.getFieldTwo(); 
     STRUCT struct = new STRUCT(structDescriptor, ps.getConnection(), params); 
     structs[index] = struct; 
    } 

    ArrayDescriptor desc = ArrayDescriptor.createDescriptor("YOUR_OBJECT_ARRAY", ps.getConnection()); 
    ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs); 
    ps.setArray(i, oracleArray); 
} 

그리고는 XML 매핑에 대한 예입니다 여기

그리고 당신이 DAO에서 호출 할 수있는 방법입니다 :

public void update(List array) { 
    Map<String, Object> queryParams = new HashMap<String, Object>(); 
    queryParams.put("p_array", array); 
    try { 
     client.update("HashMapResult.updateHierPersonAssign", queryParams); 
    } catch (SQLException e) { 
    } 
} 

그리고 내 절차는 다음과 같습니다 (그냥 테스트 테이블에 행을 삽입) :

Procedure j_update_hier_person_assign (p_array IN YOUR_OBJECT_ARRAY) is 
    begin 
    FOR i IN 1..p_array.count LOOP 
     --dbms_output.put_line(); 
     insert into test (a) values (p_array(i).field_one); 
    END LOOP; 
    end; 
관련 문제