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

        

Reply via email to