编写mybatis typeHandler
重写方法
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
Connection conn = null;
try {
if (null != o) {
conn = preparedStatement.getConnection();
List<SecomLdPoInIfacePO> list = (ArrayList<SecomLdPoInIfacePO>) o;
conn = conn.unwrap(OracleConnection.class);
ARRAY array = getArray(conn, "SECOM_LD_PO_IN_TYPE", "SECOM_LD_PO_IN_TYPE_T", list);
preparedStatement.setArray(i, array);
}
} catch (Exception e) {
LOGGER.error("SecomLdPoInIfacePO做为数组入参异常", e);
}
}
private ARRAY getArray(Connection con, String OracleObj, String Oraclelist, List<SecomLdPoInIfacePO> data) throws Exception {
ARRAY array = null;
ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con);
STRUCT[] structs = new STRUCT[data.size()];
StructDescriptor structdesc = StructDescriptor.createDescriptor(OracleObj, con);
for (int i = 0; i < data.size(); i++) {
//需要把字段与oracle中的自定义类型的字段一一对应
Object[] result = {
data.get(i).getLdId(),
data.get(i).getSupplyName(),
data.get(i).getInRepNo(),
data.get(i).getWarehouseCode(),
data.get(i).getRepType(),
data.get(i).getSubStockName(),
data.get(i).getCustomerGoodsInfoId(),
data.get(i).getCustomerBrand(),
data.get(i).getQuantity(),
data.get(i).getOriginDateCode(),
data.get(i).getDateCode(),
data.get(i).getGoodsPlace(),
data.get(i).getCustPo(),
data.get(i).getPrice(),
data.get(i).getNoTaxPrice(),
data.get(i).getCurrency(),
data.get(i).getInDate(),
data.get(i).getDataType(),
data.get(i).getComOrder()
};
structs[i] = new STRUCT(structdesc, con, result);
}
array = new ARRAY(desc, con, structs);
return array;
}
导入包
oracle 11 及以上使用orai18n.jar
oracle 10及以下使用nls_charset12.jar
如果不使用这些包,则字符串不能传入数据库
调用存储过程
<select id="poInIface" parameterType="java.util.Map" statementType="CALLABLE">
{call secom_ld_edi_pkg.ins_ld_po_in(
#{p_po_in,mode=IN,javaType=java.util.List,jdbcType=ARRAY,typeHandler=com.sekorm.edi.handlers.SecomLdPoInTypeHandler},
#{x_flag,mode=OUT,javaType=java.lang.String,jdbcType=VARCHAR},
#{x_msg,mode=OUT,javaType=java.lang.String,jdbcType=VARCHAR}
)}
</select>