生一个mybatis的批量插入数据工具类
时间: 2023-06-01 14:03:31 浏览: 108
以下是一个简单的MyBatis批量插入数据的工具类:
```
public class BatchInsertUtil {
private static final int BATCH_SIZE = 1000;
public static <T> void batchInsert(List<T> dataList, SqlSession sqlSession, String statement) {
if (dataList == null || dataList.isEmpty()) {
return;
}
int size = dataList.size();
int batchCount = size % BATCH_SIZE == 0 ? size / BATCH_SIZE : size / BATCH_SIZE + 1;
int startIndex, endIndex;
for (int i = 0; i < batchCount; i++) {
startIndex = i * BATCH_SIZE;
endIndex = Math.min((i + 1) * BATCH_SIZE, size);
List<T> subList = dataList.subList(startIndex, endIndex);
sqlSession.insert(statement, subList);
}
sqlSession.flushStatements();
}
}
```
使用方法如下:
```
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
BatchInsertUtil.batchInsert(dataList, sqlSession, "com.example.mapper.insertBatch");
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
} finally {
sqlSession.close();
}
```
其中,`dataList`为待插入的数据列表,`sqlSession`为MyBatis的`SqlSession`对象,`statement`为对应的Mapper方法名称。要使用该工具类,需要在Mapper文件中定义对应的批量插入方法,例如:
```
<insert id="insertBatch" parameterType="java.util.List">
insert into my_table (column1, column2, column3) values
<foreach collection="list" item="item" separator=",">
(#{item.column1}, #{item.column2}, #{item.column3})
</foreach>
</insert>
```
该方法使用了MyBatis的`foreach`标签,将数据列表中的每一个元素都插入到数据库中。由于批量插入数据可能会造成内存溢出,因此在插入前需要将数据列表按照一定的大小分为多个批次插入,本例中批次大小为1000。在插入完成后需要调用`flushStatements()`方法来刷新缓存,确保所有的语句都已经发送到数据库。
阅读全文