我正在尝试使用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?
答案 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。
希望这有帮助。