在MyBatis中,批量插入是一种常见的高效插入方式,可以大大减少操作数据库的次数,提高插入效率。本文将详细讲解MyBatis中批量插入的两种方式及使用方法。
使用JDBC批量插入
MyBatis底层封装了JDBC,所以可以使用JDBC的批量操作功能进行批量插入。具体实现步骤如下:
- 创建数据库表
假设我们要插入的表是user
,可以通过以下语句创建表:
CREATE TABLE user (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
age INT(2) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 配置Mapper文件
在Mapper文件中定义一个插入操作的方法,如下所示:
<mapper namespace="com.example.UserMapper">
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user (name, age) VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.name}, #{item.age})
</foreach>
</insert>
</mapper>
其中parameterType
为List类型,即要插入的数据列表。
- 编写DAO方法
在DAO中定义插入方法,如下所示:
public interface UserMapper {
void batchInsert(List<User> userList);
}
- 调用批量插入方法
在Java代码中,创建一个SqlSession
对象,并调用Mapper中的批量插入方法,如下所示:
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = new ArrayList<User>();
// 添加需要插入的数据
userMapper.batchInsert(userList);
sqlSession.commit();
以上代码中,sqlSession.getMapper()
方法获取了UserMapper
的实现类,并调用了其中的批量插入方法。
使用MyBatis批量插入
MyBatis也提供了一种更为方便的方式进行批量插入,具体实现步骤如下:
- 配置Mapper文件
在Mapper文件中定义一个批量插入操作的方法:
<mapper namespace="com.example.UserMapper">
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user (name, age) VALUES
<foreach collection="list" item="item" index="index">
(#{item.name}, #{item.age})
</foreach>
</insert>
</mapper>
其中parameterType
为List类型,即要插入的数据列表。
- 编写DAO方法
在DAO中定义批量插入操作的方法,如下所示:
public interface UserMapper {
void batchInsert(List<User> userList);
}
- 调用批量插入方法
在Java代码中,创建一个SqlSession
对象,并调用Mapper中的批量插入方法,如下所示:
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = new ArrayList<User>();
// 添加需要插入的数据
userMapper.batchInsert(userList);
sqlSession.commit();
以上代码中,sqlSession.getMapper()
方法获取了UserMapper
的实现类,并调用了其中的批量插入方法。
示例代码:
public void testBatchInsert() {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = new ArrayList<User>();
for (int i = 0; i < 100000; i++) {
User user = new User();
user.setName("name_" + i);
user.setAge(i % 100);
userList.add(user);
}
long startTime = System.currentTimeMillis();
userMapper.batchInsert(userList);
sqlSession.commit();
long endTime = System.currentTimeMillis();
System.out.println("批量插入耗时:" + (endTime - startTime) + "ms");
sqlSession.close();
}
执行以上示例代码,会向user
表中插入10万条数据,并输出批量插入所用时间。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis中批量插入的两种方式(高效插入) - Python技术站