Java 为用户定义的Oracle表类型编写MyBatis3 TypeHandler

Java 为用户定义的Oracle表类型编写MyBatis3 TypeHandler,java,oracle,mybatis,Java,Oracle,Mybatis,我很难编写一个TypeHandler来将Oracle用户定义的表类型转换为Java对象列表 数据库类型和功能规范的定义如下: CREATE OR REPLACE TYPE MySchema.MY_TYPE IS OBJECT ( first_name VARCHAR2(50), last_name VARCHAR2(50) ); CREATE OR REPLACE TYPE MySchema.MY_TYPE_TBL IS TABLE OF MY_TYPE; FU

我很难编写一个TypeHandler来将Oracle用户定义的表类型转换为Java对象列表

数据库类型和功能规范的定义如下:

CREATE OR REPLACE TYPE MySchema.MY_TYPE IS OBJECT (
    first_name    VARCHAR2(50),
    last_name     VARCHAR2(50)
);

CREATE OR REPLACE TYPE MySchema.MY_TYPE_TBL IS TABLE OF MY_TYPE;

FUNCTION GET_MY_STUFF(my_user_name IN VARCHAR2) RETURN MySchema.MY_TYPE_TABLE;
我有一个MyBatis映射器,其中包含以下调用:

<resultMap id="myResultMap" type="GetMyStuffResult" />
<select id="getMyStuff" statementType="CALLABLE" parameterType="map">
    {#{return_value, mode=OUT,
                     typeHandler=MyStuffToList
                     jdbcTypeName=MySchema.MY_TYPE_TABLE,
                     jdbcType=ARRAY} = 
         call MySchema.MyPackage.GET_MY_STUFF (
              my_user_name => #{userName, mode=IN, jdbcType=VARCHAR}
     )}
</select>

{#{返回值,mode=OUT,
typeHandler=MyStuffToList
jdbcTypeName=MySchema.MY_TYPE_表,
jdbcType=ARRAY}=
打电话给MySchema.MyPackage.GET_我的东西(
my_user_name=>#{userName,mode=IN,jdbcType=VARCHAR}
)}
最后,我尝试编写一个TypeHandler,但在getResult覆盖中失败得很惨:

public class MyStuffToList implements TypeHandler<List<GetMyStuffResult>> {

    // Other Overrides Here

    @Override
    public List<GetMyStuffResult> getResult(CallableStatement cs, int columnIndex) 
    throws SQLException {
        List<GetMyStuffResult> results = new ArrayList<GetMyStuffResult>();
        Array array = cs.getArray(columnIndex);

        // HOW DO I CONVERT THE Array TO List<GetMyStuffResult> ???

        return results;
    }
}
公共类MyStuffToList实现类型处理程序{
//这里有其他覆盖
@凌驾
公共列表getResult(CallableStatement cs,int columnIndex)
抛出SQLException{
列表结果=新建ArrayList();
Array Array=cs.getArray(columnIndex);
//如何将数组转换为列表???
返回结果;
}
}

我似乎无法从传递到
TypeHandler
CallableStatement
中得到我想要的列表。

以下是我为使其正常工作所做的

TypeHandler
需要创建引用单个Oracle类型(而不是表类型)的类型映射:


当然,您需要进行适当的空值和数据检查等。

以下是我为使其正常工作所做的工作

TypeHandler
需要创建引用单个Oracle类型(而不是表类型)的类型映射:

当然,您需要进行适当的空值和数据检查,等等

public class MyStuffToList implements TypeHandler<List<GetMyStuffResult>> {

    // Other Overrides Here

    @Override
    public List<GetMyStuffResult> getResult(CallableStatement cs, int columnIndex) 
    throws SQLException {
        List<GetMyStuffResult> results = new ArrayList<GetMyStuffResult>();
        Array array = cs.getArray(columnIndex);

        // Add a TypeMap to map the Oracle object to a Java class
        Map<String, Class<?>> typeMap = new HashMap<String, Class<?>>();
        typeMap.put("MySchema.MY_TYPE", GetMyStuffResult.class);

        // Get an array of Java objects using that type map
        Object[] javaObjects = (Object[]) array.getArray(typeMap);

        // add each of these converted objects to the results list
        for (Object javaObject : javaObjects) {
            results.add((GetMyStuffResult) javaObject);
        }

        return results;
    }
}
public class GetMyStuffResult implements ORAData, ORADataFactory {

    string first_name;
    string last_name;

    // Assume appropriate getters and setters for all properties here
    // public String getFirstName() {
    //      |
    //      |

    // Implement ORAData and ORADataFactory
    public ORAData create(Datum datum, int sqlType throws SQLException {
       GetMyStuffResult result = new GetMyStuffResult();

       Struct javaStruct = (Struct) datum;
       Object[] attributes = javaStruct.getAttributes();
       // ORDER MATTERS HERE - must be in order defined in Oracle
       result.setFirstName(attributes[0].toString());
       result.setLastName(attributes[1].toString());
    }

    public Datum toDatum(Connection conn) throws SQLException {
        return null;
    }
}