Ibatis TypeHandler和存储过程中类型的空Varchar参数

时间:2016-08-19 09:02:12

标签: oracle mybatis ibatis typehandler

在mybatis中,spring应用程序我有一个TypeHandler,它填充调用Oracle存储过程所需的ARRAY OF STRUCTS的数据。 blob条目在存储过程中正确填充并可见;字符串条目不是,不发送字符串数据。日志中不会打印错误或警告。数据在应用程序中不为空且有效。数据在应用程序和oracle之间消失。

我的处理程序的setParameter实现如下所示:

public void setParameter(PreparedStatement ps, int i, List<MailAttachment> parameter,
    JdbcType jdbcType) throws SQLException 
{
    List<MailAttachment> attachmentList =  parameter;

    OracleConnection oracleConnection = ps.getConnection().unwrap(OracleConnection.class);

    StructDescriptor structDescriptor = StructDescriptor.createDescriptor(ATTACHMENT, oracleConnection);
    Object[] structs = null;
    structs = new Object[attachmentList == null ? 0 :attachmentList.size()];
    if (attachmentList != null) {  
        //CharacterSet chs = CharacterSet.make(CharacterSet.UTF8_CHARSET);
        for (int index = 0; index < attachmentList.size(); index++) {

            MailAttachment mailAttachment = attachmentList.get(index);
            BLOB blob = null;
            if (mailAttachment.getData() != null){
                blob = BLOB.createTemporary(oracleConnection,false,BLOB.DURATION_SESSION);
               // filling blob works
            }
            CHAR attachName = new CHAR(mailAttachment.getFilename(), CharacterSet.make(CharacterSet.UTF8_CHARSET) );
            CHAR contentType = new CHAR(mailAttachment.getContentType(), CharacterSet.make(CharacterSet.UTF8_CHARSET) );

            STRUCT struct = new STRUCT(structDescriptor, oracleConnection,
                                new Object[] {blob, attachName, contentType, null}
                                );
            structs[index] = struct;
        }
    }

    ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor(ATTACHMENT_LIST, oracleConnection);
    ARRAY oracleArray = new ARRAY(arrayDesc, oracleConnection, structs);
    ps.setObject(i, oracleArray);
}

1 个答案:

答案 0 :(得分:1)

此问题与Oracle JDBC驱动程序有关,并且它支持国际化。

请记住在classpath / pom文件中将orai18n.jar包含在ojdbc jar文件的正确版本中。

如果缺少orai18n.jar:

  • setParameters:Oracle类型中的varchar2参数将设置为null
  • getResult / getNonNullParameter:varchar2参数将被加载到java类中作为&#34; ???&#34;字符串。