236.7. MyBatis의 더 나은 제어를 위해 StatementType 사용
MyBatis 엔드포인트로 라우팅할 때 실행할 SQL 문이 SELECT,UPDATE,DELETE 또는 Cryostat 등인지 여부를 제어할 수 있도록 보다 세분화된 제어가 필요합니다. 예를 들어 IN 본문에 SELECT 문에 매개변수가 포함된 MyBatis 엔드포인트로 라우팅하려면 다음을 수행할 수 있습니다.
위의 코드에서는 selectAccountById 를 호출할 수 있으며 IN 본문에는 Integer 유형과 같이 검색할 계정 ID가 포함되어야 합니다.
SelectList 와 같은 다른 작업에 대해서도 동일한 작업을 수행할 수 있습니다.
그리고 UPDATE 에서도 IN 본문으로 계정 오브젝트를 MyBatis에 보낼 수 있습니다.
236.7.1. Using InsertList StatementType 링크 복사링크가 클립보드에 복사되었습니다!
Camel 2.10에서 사용 가능
MyBatis를 사용하면 for-each 배치 드라이버를 사용하여 여러 행을 삽입할 수 있습니다. 이를 사용하려면 매퍼 XML 파일에서 <foreach>를 사용해야 합니다. 예를 들면 다음과 같습니다.
그런 다음 다음과 같이 InsertList 문 유형을 사용하는 my#159is 엔드포인트에 Camel 메시지를 전송하여 여러 행을 삽입할 수 있습니다.
236.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 문 유형을 사용하는 mymgris 엔드포인트에 Camel 메시지를 전송하여 여러 행을 업데이트할 수 있습니다.
from("direct:start")
.to("mybatis:batchUpdateAccount?statementType=UpdateList")
.to("mock:result");
236.7.3. Using 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 문 유형을 사용하는 my#159is 엔드포인트에 Camel 메시지를 전송하여 여러 행을 삭제할 수 있습니다.
from("direct:start")
.to("mybatis:batchDeleteAccount?statementType=DeleteList")
.to("mock:result");
236.7.4. InsertList, UpdateList 및 DeleteList StatementTypes에서 확인 링크 복사링크가 클립보드에 복사되었습니다!
모든 유형(List, Map 등)의 매개 변수를 mybatchis로 전달할 수 있으며, 최종 사용자는 my#159is 동적 쿼리 기능을 사용하여 필요에 따라
를 처리할 책임이 있습니다.
236.7.5. 예약된 폴링 예 링크 복사링크가 클립보드에 복사되었습니다!
이 구성 요소는 예약된 폴링을 지원하므로 폴링 소비자로 사용할 수 있습니다. 예를 들어 1분마다 데이터베이스를 폴링하려면 다음을 수행합니다.
from("mybatis:selectAllAccounts?delay=60000")
.to("activemq:queue:allAccounts");
자세한 옵션은 "ScheduledPollConsumer Options" on Polling Consumer를 참조하십시오.
또는 타이머 또는 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>
236.7.6. onConsume 사용 링크 복사링크가 클립보드에 복사되었습니다!
이 구성 요소는 Camel에서 데이터를 사용하고 처리한 후 명령 실행을 지원합니다. 이를 통해 데이터베이스에서 post updates를 수행할 수 있습니다. 모든 설명은 UPDATE 문이어야 합니다. Camel은 이름을 쉼표로 구분해야 하는 여러 명령 실행을 지원합니다.
아래 경로는 consumeAccount 구문 데이터가 처리되는 방법을 보여줍니다. 이를 통해 데이터베이스의 행 상태를 처리하도록 변경할 수 있으므로 두 번 이상 사용하지 않습니다.
sqlmap 파일의 구문은 다음과 같습니다.And the statements in the sqlmap file:
236.7.7. 트랜잭션 참여 링크 복사링크가 클립보드에 복사되었습니다!
표준 MyBatis Cryostat MapConfig.xml 파일 외부의 데이터베이스 구성을 외부화하는 작업이 포함되므로 camel-my controlPlaneis에서 트랜잭션 관리자를 설정하는 것은 약간 까다로울 수 있습니다.
첫 번째 부분에서는 DataSource 의 설정이 필요합니다. 일반적으로 이 풀은 Spring 프록시로 래핑해야 하는 풀(DBCP 또는 c3p0)입니다. 이 프록시를 사용하면 DataSource 를 사용하지 않는 것이 Spring 트랜잭션에 참여할 수 있습니다(MyBatis Cryostat SessionFactory 는 이 작업을 수행합니다).
<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>
그런 다음 my#159is-springCryostatSessionFactoryBean 이 동일한 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-myerrorsis 구성 요소는 해당 팩토리로 구성됩니다.
<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>