2012-10-04 6 views
7

Bunu bir süredir araştırıyorum ve hiçbir gerçek cevap bulamıyorum.Nasıl MyBatis kullanarak Oracle Stored Prosedürü için Nesnelerin Java Listesi Pass?

Tablo satır türünün bir tablosu olan bir dizi parametreye sahip bir Oracle saklı yordamım var. Bu nedenle, örneğin: pacakge Beyan

:

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; 

Oracle Prosedür: Java tarafında

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

, ben her birini temsil eden nesnelerin 3 mukabil Listeleri sahip Java'da bulunan parametreler. Bu senaryoda MyBatis'i kullanarak Oracle prosedürünü çağırmak mümkün mü?

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

Nesnelerin kendisi, String ve Tamsayı özellikleriyle ve ilgili alıcıları ve ayarlayıcılarıyla basit VO'lardır.

Nasıl devam edeceğime gerçekten emin değilim. Java nesne listelerini bir şekilde Oracle türleriyle eşleştirmem gerekiyor mu?

Şimdiden teşekkürler.

cevap

7

Zaten yapıp yapmadığınızı anlayamıyorum, ancak tanımlanmış Oracle nesnelerine ihtiyacınız olacak.

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; 
/

Sonra Java, Oracle nesnelere nesneleri eşleştirmek için tip işleyicileri yazabilirsiniz.

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); 
    } 
} 

Sonra

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

bulamıyorum TypeHandler için sınıf/kavanoz. zaten ojdbc6.jar var – aishu

0

Andy Pryor cevabı test ettim ve gerçekten işe yarıyor çok iyidir, yordamı çağırmak. Ama typeHandler bir hata var:

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

olmalıdır: TypeHandler yanı hata var

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

: (hayır "paketler" var ve yöntem parametreleri bazı farklar var olduğunu

<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> 
: my versiyonu) burada

@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); 
} 

Ve xml eşlemesi için bir örnektir Burada

Ve DAO diyebilirsiniz nasıl:

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) { 
    } 
} 

Ve prosedür böyle görünüyor (bu sadece bir test tabloya bir satır ekler):

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;