MyBatis批量插入数据的三种方法实例
在MyBatis中,批量插入数据的操作可以显著提高数据库的性能。本文将介绍MyBatis中常用的三种批量插入数据的方法。
方法一:使用foreach标签
使用foreach标签可以很方便地实现批量插入数据,具体实现步骤如下:
- 在mapper文件中编写批量插入数据的SQL语句,其中使用foreach标签循环插入数据。
xml
<insert id="batchInsert" parameterType="java.util.List">
insert into tb_book(title, author, price) values
<foreach collection="list" item="book" separator=",">
(#{book.title}, #{book.author}, #{book.price})
</foreach>
</insert>
- 在Java代码中调用批量插入数据的方法,并传入需要插入的数据列表。
```java
List
bookList.add(new Book("Java编程思想", "Bruce Eckel", 79.80));
bookList.add(new Book("Head First Java", "Kathy Sierra,Bert Bates", 89.00));
bookList.add(new Book("Thinking in Java", "Bruce Eckel", 109.50));
bookMapper.batchInsert(bookList);
```
这样就实现了批量插入数据的操作。
方法二:使用SQL批处理
使用SQL批处理可以一次性提交多个SQL语句,从而达到批量插入数据的效果。具体实现步骤如下:
- 在Java代码中先获取到SQL语句执行的Statement对象,调用setAutoCommit方法将自动提交事务设置为false。
java
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
statement.getConnection().setAutoCommit(false);
- 在for循环中编写插入数据的SQL语句,并使用addBatch方法将SQL语句添加到批处理中。
java
for (Book book : bookList) {
String sql = String.format("insert into tb_book(title, author, price) values('%s','%s',%.2f)",
book.getTitle(), book.getAuthor(), book.getPrice());
statement.addBatch(sql);
}
- 调用executeBatch方法执行批处理。
java
statement.executeBatch();
- 最后调用commit方法提交事务,并将自动提交事务设置为true。
java
statement.getConnection().commit();
statement.getConnection().setAutoCommit(true);
这样就实现了使用SQL批处理实现批量插入数据的操作。
方法三:使用第三方插件
在MyBatis中,可以使用第三方插件进行批量插入数据的操作。常见的插件有MyBatis-Plus和MyBatis-Batch。这里以MyBatis-Batch插件为例,具体实现步骤如下:
- 添加MyBatis-Batch依赖。
xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-batch</artifactId>
<version>2.1.3</version>
</dependency>
- 在mapper文件中声明使用MyBatis-Batch插件。
xml
<mapper namespace="com.example.mapper.BookMapper">
<insert id="batchInsert" parameterType="java.util.List"
useGeneratedKeys="true" keyProperty="id">
insert into tb_book(title, author, price)
values
<foreach collection="list" item="book" separator=",">
(#{book.title}, #{book.author}, #{book.price})
</foreach>
</insert>
</mapper>
- 在Java代码中使用BatchExecutor实现批处理。
```java
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
try {
bookMapper.batchInsert(bookList);
sqlSession.commit();
} finally {
sqlSession.close();
}
```
这样就实现了使用MyBatis-Batch插件实现批量插入数据的操作。
示例演示
以下是一个完整的示例,演示如何使用MyBatis实现批量插入数据的操作。
- Book.java
```java
public class Book {
private Long id;
private String title;
private String author;
private Double price;
// 省略getter和setter方法
}
```
- BookMapper.java
java
public interface BookMapper {
void batchInsert(List<Book> bookList);
}
- BookMapper.xml
xml
<mapper namespace="com.example.mapper.BookMapper">
<insert id="batchInsert" parameterType="java.util.List"
useGeneratedKeys="true" keyProperty="id">
insert into tb_book(title, author, price)
values
<foreach collection="list" item="book" separator=",">
(#{book.title}, #{book.author}, #{book.price})
</foreach>
</insert>
</mapper>
- BatchInsertTest.java
```java
public class BatchInsertTest {
public static void main(String[] args) {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
try {
List<Book> bookList = new ArrayList<>();
bookList.add(new Book("Java编程思想", "Bruce Eckel", 79.80));
bookList.add(new Book("Head First Java", "Kathy Sierra,Bert Bates", 89.00));
bookList.add(new Book("Thinking in Java", "Bruce Eckel", 109.50));
bookMapper.batchInsert(bookList);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
}
```
以上示例演示了如何使用MyBatis批量插入数据。其中方法一和方法三使用的都是批量插入数据的方法,而方法二使用的是SQL批处理的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis批量插入数据的三种方法实例 - Python技术站