MyBatis和Sybase存储过程 - 带有未命名列

时间:2016-10-31 13:10:49

标签: java orm sybase mybatis spring-mybatis

我正在尝试使用MyBatis映射Sybase存储过程的ResultSet,但是我遇到了一些未命名列的问题。 该过程返回一行包含4列,其中2列完全没有名称:

+---id---|------|-----------|---description---+
     1     name1  surname1        desc1

resultmap .xml文件如下所示(检查第二个和第三个结果标记):

<resultMap id="person" type="foo.Person">
    <result column="id" property="id"/>
    <result column="" property="name"/>
    <result column="" property="surname"/>
    <result column="description" property="description"/>
</resultMap>

我无法控制存储过程代码,因此无法为未命名的列添加别名。 检查以前版本的MyBatis,我看到过去你可以通知ResultMap中的columnIndex,但现在它似乎不再可用了。 是否有某种可用于此的自定义ResultSet处理程序?或者是某种定制的TypeHandler?

1 个答案:

答案 0 :(得分:0)

这是一种解决方法,但由于您无法更改数据库中的过程以添加名称,我无法想到其他方式。

我们的想法是创建一个特定于这些字段的类型处理程序。请注意,如果您有一个未命名的字段,则可以使用空列名称进行映射。

因此,在您的情况下,结果图将如下所示:

<resultMap id="person" type="foo.Person">
    <result column="id" property="id"/>
    <result column="" property="name" typeHandler="foo.PersonNameTypeHandler"/>
    <result column="" property="surname"  typeHandler="foo.PersonSurnameTypeHandler"/>
    <result column="description" property="description"/>
</resultMap>

sybase驱动程序将所有未命名的列返回为&#34;&#34;。

MyBatis要求您将列映射到现有列名称,否则它将不会调用类型处理程序。因此,您无法为这些列创建假名称,因此只需对所有未命名的列使用空,最后只要强制空名称强制MyBatis处理该列。

重要的部分是在类型处理程序中,它只返回基于列号的值,其中&#34; name&#34;应该是:

public class PersonNameTypeHandler extends BaseTypeHandler<String> {
    ...
    @Override
    public String getNullableResult(ResultSet rs, String columnName) {
        return rs.getString(2);
    }
    ...
}

重要的是要注意被调用的方法传递columnName,在这种情况下它将为空,所以只需忽略它并按列索引返回。

此外,ResultSet列索引从1开始,因此在这种情况下获取名称得到2,对于surname,实现将是:

...
return rs.getString(3);
...

另一个重要细节是,列顺序必须与过程中定义的退货订单相关,而不是与结果图相关。如果&#34;名称&#34;专栏是&#34;描述&#34;在上面的结果映射中的列,但是程序返回没有改变,getString中使用的索引仍然是2,而不是4。

希望这有帮助。