2016-10-31 5 views
0

MyBatis를 사용하여 Sybase 저장 프로 시저의 ResultSet을 매핑하려하지만 이름없는 열에 문제가 있습니다. 절차는 전혀 이름이없는이있는 4 열, 함께 단일 행을 반환MyBatis 및 Sybase 저장 프로 시저 - 이름이없는 열이있는 ResultSet

된 resultMap .xml 파일이 (두 번째와 세 번째 결과 태그를 확인)과 같다
+---id---|------|-----------|---description---+ 
    1  name1 surname1  desc1 

:

<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

해결 방법이지만 다른 방법으로 생각할 수없는 이름을 추가하기 위해 데이터베이스에서 프로 시저를 변경할 수 없기 때문에.

아이디어는 해당 필드에 특정한 형식 처리기를 만드는 것입니다. 이름없는 필드가 하나만있는 경우 빈 열 이름을 사용하여 매핑 할 수 있습니다.

따라서 귀하의 경우 결과 맵은 다음과 같이 표시됩니다

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

사이베이스 드라이버는 "모든 익명의 열을 반환합니다."

MyBatis는 열을 기존 열 이름에 매핑해야하거나 형식 핸들러를 호출하지 않습니다. 따라서이 열의 가짜 이름을 만들 수 없으므로 이름이없는 모든 열에는 empty를 사용하고, MyBatis가 열을 처리하도록하려면 빈 이름으로 끝냅니다. 중요한 부분은 타입 핸들러에

, 그냥 "이름이"있어야하는데 열 수를 기준으로 값을 반환

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

이 호출 방법은 COLUMNNAME를 전달하는주의하는 것이 중요하다 이 경우에는 비어있게되므로 무시하고 열 인덱스로 반환하십시오.

또한, ResultSet의 컬럼의 인덱스는 2 얻을 이름을 얻기 위해이 경우에, 그래서 성 (姓)의 구현이 될 것이다, 1에서 시작 :

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

또 다른 중요한 세부 사항 열 순서는 관련이 있어야한다는 것입니다 프로 시저에 정의 된 리턴 순서가 아니라 결과 맵에 정의됩니다. 위의 결과 맵에서 "description"열 뒤에 "name"열이 있지만 프로 시저 반환 값이 변경되지 않은 경우 getString에 사용 된 인덱스는 4가 아닌 2가됩니다.

희망이 있습니다.