Add a new camel-mybatis statementType of 'InsertList' (similar to SelectOne versus SelectList) to allow for mybatis foreach driven batch insert statements ----------------------------------------------------------------------------------------------------------------------------------------------------------
Key: CAMEL-5143 URL: https://issues.apache.org/jira/browse/CAMEL-5143 Project: Camel Issue Type: Improvement Components: camel-mybatis Affects Versions: 2.10.0 Reporter: Aaron Daubman Priority: Minor Fix For: 2.10.0 The camel-mybatis code will iterate over any list passed in and attempt to insert each item individually, bypassing foreach support in statements like: <insert id="batchInsertdataCore" parameterType="java.util.List"> INSERT INTO CORE_DATA ( <include refid="dataCoreColumns"/> ) VALUES ( <foreach item="dataCore" collection="_parameter" open="" close="" separator="),("> #{dataCore.event_id}, #{dataCore.start_time_val}, #{dataCore.end_time_val} </foreach> ) </insert> This results in mybatis generating the following error even when the route is receiving a list of objects as desired: ### Error updating database. Cause: org.apache.ibatis.builder.BuilderException: Error evaluating expression '_parameter'. Return value (dataCore{ event_id=111222333, start_time_val=Thu Mar 01 02:03:04 EST 2001, end_time_val=Thu Mar 01 02:03:05 EST 2001, } ) was not iterable. ### The error may exist in mybatis/dataCore.xml ### The error may involve dataCore.batchInsertdataCore ### The error occurred while executing an update ---from camel/trunk/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java --- private void doInsert(Exchange exchange) throws Exception { SqlSessionFactory client = endpoint.getSqlSessionFactory(); SqlSession session = client.openSession(); try { Object result; Object in = exchange.getIn().getBody(); if (in != null) { // lets handle arrays or collections of objects Iterator<?> iter = ObjectHelper.createIterator(in); while (iter.hasNext()) { Object value = iter.next(); LOG.trace("Inserting: {} using statement: {}", value, statement); result = session.insert(statement, value); doProcessResult(exchange, result); } } else { LOG.trace("Inserting using statement: {}", statement); result = session.insert(statement); doProcessResult(exchange, result); } } finally { session.commit(); session.close(); } } ---from camel/trunk/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java --- It should be simple to add a new statementType = 'InsertList' (similar to SelectOne versus SelectList) and add it to the switch statement further up in the MyBatisProducer.java code. Then a new doInsertBatch would be created, copying the code above and just emoving the iterator related code, simply calling: result = session.insert(statement, in); -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira