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>