gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:00 24 4
gpt4 key购买 nike

我在编写 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>

最后,我尝试编写一个 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;
}
}

我似乎无法从传递到 TypeHandlerCallableStatement 到我想要的列表。

最佳答案

这是我为使其发挥作用所做的工作。

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

然后,DTO 类本身需要实现 ORADataORADataFactory 将所有内容粘合在一起:

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

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

关于java - 为用户定义的 Oracle 表类型编写 MyBatis3 TypeHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44136600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com