2014-05-22 3 views
1

일부 SQL 쿼리를 작성하는 데 myBatis를 사용하고 있는데 문제는 여러 열 (약 50 열)이있는 테이블이 있다는 것입니다. 따라서이 같은 insert 쿼리를 작성 :java 메서드를 호출하여 myBatis에서 SQL 쿼리를 생성합니다.

<insert id="insert" parameterType="com.atos.tables.Table1> 
    insert into ot (id, c1, c2, ....,c50) values (#{id}, #{c1},#{c2},... #{c50}) 
</insert> 

매우 지루한입니다.

String 쿼리를 자동으로 생성하는 java 메서드를 만들 수 있지만이 메서드는 mapper.xml에서 어떻게 호출 할 수 있습니까?

그리고 myBatis 어노테이션을 사용하면 인터페이스에서 메소드를 호출 할 수 없습니다. 내가 뭔가를 놓치고 있는지 모르겠다. 할 방법이 있니?

도와 주셔서 감사합니다.

답변

1

이 작업을 직접 수행 할 수있는 방법이 없습니다.

당신이 시도 할 수있는 컴파일 또는 배포 시간에 별도의 파일로 열을 생성하는 것입니다 <sql> elements and then include them 매퍼 파일에 필요에 따라.

statement-builders 기능이 MyBatis에 추가되어 코드에서 SQL을 빌드 할 수있게 해 주므로이 기능을 사용할 수도 있습니다.

1

주요 문제는 쿼리 문자열 생성에 있지 않습니다. 예를 들어 mybatis-velocity과 같은 스크립팅 지원을 사용하여 쉽게 수행 할 수 있습니다.

주요 문제는 매개 변수를 동적으로 설정하는 것입니다. 동적 인 org.apache.ibatis.mapping.ParameterMapping을 생성 할 커스텀 지시어를 정의함으로써 mybatis-velocity로 할 수 있습니다. 그것은이 같은 매퍼에서 사용할 수 있습니다

:

<insert id="insert"> 
    insert into ot (
    #field_names('com.atos.tables.Table1') 
    ) values (@{id}, 
    #params_for_fields('com.atos.tables.Table1') 
    ) 
</insert> 

여기 #field_names ADN의 #params_for_fields 당신이 구현해야하는 사용자 정의 지침입니다. field_names은 인수로 전달 된 클래스의 필드를 반복하고 쉼표로 구분 된 필드 목록을 생성해야합니다.

params_for_fields은 매개 변수 매핑을 새로 작성하고 속도 언어 드라이버가 유지하는 매개 변수 매핑 목록에 추가해야합니다.

repeat 지시어와 ParameterMappingCollector을 보면 매개 변수 매핑을 만들고 액세스하는 방법을 알 수 있습니다.

+0

이 솔루션의 문제점은 필드가 복잡한 이름 (c1, c2가 아닌 것)입니다. 단순화하기 위해이 이름을 사용했습니다. 쿼리 생성 방법에서 클래스의 필드를 가져 와서 생성합니다. 쿼리. – Mouna

+0

이것은 문제가되지 않습니다. 사용자 정의 지시문을 형성하여 클래스의 필드를 반복하는 지시문을 작성할 수 있습니다. 답변을 업데이트했습니다. –

관련 문제