235.7. MyBatis에 대한 더 나은 제어를 위해 statementType 사용
MyBatis 엔드포인트로 라우팅할 때 실행할 SQL 문의가 DestinationRule ,UPDATE,DELETE 또는ECDHE 등인지 여부를 제어할 수 있도록 더 세밀한 제어가 필요합니다. 예를 들어 IN 본문에 대한 매개변수가 포함된 MyBatis 끝점으로 라우팅하려면 다음을 수행할 수 있습니다.
위의 코드에서는 MyBatis 문 selectAccountById 를 호출할 수 있으며 IN 본문에는 Integer 유형과 같이 검색하려는 계정 ID가 포함되어야 합니다.
SelectList 와 같은 다른 작업에도 동일한 작업을 수행할 수 있습니다.
그리고 UPDATE 와 마찬가지로 IN 본문으로 Account 오브젝트를 MyBatis로 보낼 수 있습니다.
235.7.1. InsertList StatementType 사용 링크 복사링크가 클립보드에 복사되었습니다!
Camel 2.10에서 사용 가능
MyBatis를 사용하면 for-each 일괄 처리 드라이버를 사용하여 여러 행을 삽입할 수 있습니다. 이를 사용하려면 매퍼 XML 파일에서 <foreach>를 사용해야 합니다. 예를 들면 다음과 같습니다.
그런 다음 다음과 같이 InsertList 문 유형을 사용하는 myknativeis 끝점에 Camel 메시지를 보내 여러 행을 삽입할 수 있습니다.
235.7.2. UpdateList statementType 사용 링크 복사링크가 클립보드에 복사되었습니다!
Camel 2.11에서 사용 가능
MyBatis를 사용하면 for-each 일괄 처리 드라이버를 사용하여 여러 행을 업데이트할 수 있습니다. 이를 사용하려면 매퍼 XML 파일에서 <foreach>를 사용해야 합니다. 예를 들면 다음과 같습니다.
<update id="batchUpdateAccount" parameterType="java.util.Map">
update ACCOUNT set
ACC_EMAIL = #{emailAddress}
where
ACC_ID in
<foreach item="Account" collection="list" open="(" close=")" separator=",">
#{Account.id}
</foreach>
</update>
다음으로 다음과 같이 UpdateList 문 유형을 사용하는 myknativeis 끝점에 Camel 메시지를 보내 여러 행을 업데이트할 수 있습니다.
from("direct:start")
.to("mybatis:batchUpdateAccount?statementType=UpdateList")
.to("mock:result");
235.7.3. DeleteList statementType 사용 링크 복사링크가 클립보드에 복사되었습니다!
Camel 2.11에서 사용 가능
MyBatis를 사용하면 for-each 일괄 처리 드라이버를 사용하여 여러 행을 삭제할 수 있습니다. 이를 사용하려면 매퍼 XML 파일에서 <foreach>를 사용해야 합니다. 예를 들면 다음과 같습니다.
<delete id="batchDeleteAccountById" parameterType="java.util.List">
delete from ACCOUNT
where
ACC_ID in
<foreach item="AccountID" collection="list" open="(" close=")" separator=",">
#{AccountID}
</foreach>
</delete>
그런 다음 아래와 같이 DeleteList 문 유형을 사용하는 myknativeis 끝점에 Camel 메시지를 보내 여러 행을 삭제할 수 있습니다.
from("direct:start")
.to("mybatis:batchDeleteAccount?statementType=DeleteList")
.to("mock:result");
235.7.4. InsertList, UpdateList 및 DeleteList StatementTypes에서 알림 링크 복사링크가 클립보드에 복사되었습니다!
모든 유형(List, Map 등)의 매개변수를 myECDHEis에 전달할 수 있으며 최종 사용자는 myknativeis 동적 쿼리 기능을 사용하여 필요에 따라
를 처리해야 합니다.
235.7.5. 예약된 폴링 예 링크 복사링크가 클립보드에 복사되었습니다!
이 구성 요소는 예약된 폴링을 지원하므로 폴링 소비자로 사용할 수 있습니다. 예를 들어 1분마다 데이터베이스를 폴링합니다.
from("mybatis:selectAllAccounts?delay=60000")
.to("activemq:queue:allAccounts");
자세한 내용은 "ScheduledPollConsumer Options"를 참조하십시오.
또는 Timer 또는 Quartz 구성 요소와 같은 예약된 폴링을 트리거하는 데 다른 메커니즘을 사용할 수 있습니다. 아래 샘플에서는 데이터베이스를 폴링하고 Timer 구성 요소를 사용하여 30초마다 데이터를 JMS 큐에 보냅니다.
from("timer://pollTheDatabase?delay=30000")
.to("mybatis:selectAllAccounts")
.to("activemq:queue:allAccounts");
MyBatis SQL 매핑 파일이 사용되었습니다.
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectAllAccounts" resultMap="AccountResult">
select * from ACCOUNT
</select>
235.7.6. onConsume 사용 링크 복사링크가 클립보드에 복사되었습니다!
이 구성 요소는 Camel에서 데이터를 사용하고 처리한 후 명령 실행을 지원합니다. 이를 통해 데이터베이스에서 업데이트 게시를 수행할 수 있습니다. 모든 진술은 UPDATE 문이어야 합니다. Camel은 이름이 쉼표로 구분되어야 하는 여러 명령문 실행을 지원합니다.
아래 경로는 consumeAccount 문 데이터를 실행하는 방법을 보여줍니다. 이를 통해 데이터베이스의 행 상태를 처리할 수 있으므로 두 번 이상 사용하지 않도록 합니다.
또한 sqlmap 파일의 문:
235.7.7. 트랜잭션 참여 링크 복사링크가 클립보드에 복사되었습니다!
표준 MyBatis Config.xml 파일 외부의 데이터베이스 구성을 외부화하기 때문에 camel-myknativeis에서 트랜잭션 관리자를 설정하는 것이 약간 예기치 않을 수 있습니다.
첫 번째 부분에는 DataSource 의 설정이 필요합니다. 이는 일반적으로 풀(DBCP 또는 c3p0)이며 Spring 프록시에서 래핑해야 합니다. 이 프록시를 사용하면 DataSource 를 사용하지 않는 방식으로 Spring 트랜잭션에 참여할 수 있습니다(MyBatisECDHE Session >:<y가 바로 이 작업을 수행합니다).
<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<constructor-arg>
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="org.postgresql.Driver"/>
<property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/myDatabase"/>
<property name="user" value="myUser"/>
<property name="password" value="myPassword"/>
</bean>
</constructor-arg>
</bean>
이는 속성 자리 표시자를 사용하여 데이터베이스 구성을 외부화할 수 있도록 하는 추가 이점이 있습니다.
그런 다음 트랜잭션 관리자는 가장 외부 DataSource 를 관리하도록 구성됩니다.
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
myECDHEis-spring SessionECDHEyBean 은 동일한 DataSource 를 래핑합니다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- standard mybatis config file -->
<property name="configLocation" value="/META-INF/SqlMapConfig.xml"/>
<!-- externalised mappers -->
<property name="mapperLocations" value="classpath*:META-INF/mappers/**/*.xml"/>
</bean>
그런 다음 camel-myECDHEis 구성 요소는 해당 팩토리와 함께 구성됩니다.
<bean id="mybatis" class="org.apache.camel.component.mybatis.MyBatisComponent">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
마지막으로 트랜잭션 정책은 트랜잭션 관리자의 맨 위에 정의되며 일반적으로 사용할 수 있습니다.
<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="txManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
<camelContext id="my-model-context" xmlns="http://camel.apache.org/schema/spring">
<route id="insertModel">
<from uri="direct:insert"/>
<transacted ref="PROPAGATION_REQUIRED"/>
<to uri="mybatis:myModel.insert?statementType=Insert"/>
</route>
</camelContext>