Lets see how to create ibatis Batch insert with annotations
gradle build file
dependencies { compile 'org.json:json:20131018' compile 'org.glassfish.jersey.core:jersey-client:2.27' compile 'org.glassfish.jersey.inject:jersey-hk2:2.27' implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'mysql:mysql-connector-java' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
Mapper Class
package com.scheduler.mapper; import com.scheduler.model.Resource; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface ResourceMapper { @Select("select * from resource where account_id = #{accountId}") List<Resource> findAll(@Param("accountId") long accountId); @Insert("INSERT IGNORE INTO resource(id, account_id, region_id) VALUES(#{id},#{accountId}, #{regionId})") void insert(Resource resource); }
Dao Class
package com.scheduler.dao; import com.scheduler.mapper.ResourceMapper; import com.scheduler.model.Resource; import lombok.extern.java.Log; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.logging.Level; @Log @Repository public class ResourceDao { private ResourceMapper resourceMapper; private SqlSessionFactory sqlSessionFactory; public ResourceDao(ResourceMapper resourceMapper, SqlSessionFactory sqlSessionFactory) { this.resourceMapper = resourceMapper; this.sqlSessionFactory = sqlSessionFactory; } public List<Resource> findAll(Long accountId) { return this.resourceMapper.findAll(accountId); } @Transactional() public void insert(List<Resource> newResource) { try { try (SqlSession sqlSession = this.sqlSessionFactory.openSession(ExecutorType.BATCH)) { ResourceMapper batchMapper = sqlSession.getMapper(ResourceMapper.class); for (Resource resource : newResource) { batchMapper.insert(resource); } sqlSession.commit(); } } catch (Exception e) { log.log(Level.WARNING, "error occurs while adding data", e); } } }
By default ibatis uses SimpleExecutor (ExecutorType.SIMPLE) but if you need to do batch insert need to use BatchExecutor which we are telling to the ibatis by this.sqlSessionFactory.openSession(ExecutorType.BATCH))