Sure! 首先,我们先了解一下 Mybatis 中三种批量插入数据的方式:
1.基于 statement 的方式
2.基于 batch 的方式
3.基于 foreach 标签的方式
下面我将详细讲解这三种方式的过程和示例:
基于 statement 的方式
- 创建一个包含多个 insert 语句的 sql 文件,例如
insert_test.sql
文件如下:
insert into user(name, age) values('user1', 20);
insert into user(name, age) values('user2', 21);
insert into user(name, age) values('user3', 22);
- 使用
SqlSessionFactoryBuilder
创建SqlSessionFactory
对象,并使用Resources.getResourceAsStream()
获取insert_test.sql
文件的输入流,并调用openSession()
方法获取SqlSession
对象。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
- 使用
sqlSession
对象的getConnection()
方法获取Connection
对象,调用createStatement()
方法创建Statement
对象,调用executeUpdate()
方法执行insert_test.sql
中的多条 insert 语句。
Connection conn = sqlSession.getConnection();
Statement statement = conn.createStatement();
int result = statement.executeUpdate(new String(Files.readAllBytes(Paths.get("insert_test.sql"))));
基于 batch 的方式
- 创建
UserMapper
接口,在接口中定义一个insertUser
方法,该方法的参数是一个List<User>
。在insertUser
方法的实现中,定义一个PreparedStatement
和一个int
类型的变量,循环遍历List<User>
,为PreparedStatement
设置参数,然后调用addBatch()
方法添加到批量处理中。最后调用executeBatch()
方法执行批量 sql 语句。
public interface UserMapper {
int insertUser(List<User> users);
}
@Override
public int insertUser(List<User> users) {
String sql = "insert into user(name, age) values (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
int result = 0;
for (User user : users) {
pstmt.setString(1, user.getName());
pstmt.setInt(2, user.getAge());
pstmt.addBatch();
if (++result % 1000 == 0) {
pstmt.executeBatch();
}
}
pstmt.executeBatch();
return result;
}
}
- 使用
SqlSessionFactoryBuilder
创建SqlSessionFactory
对象,并使用Resources.getResourceAsStream()
获取mybatis-config.xml
文件的输入流,并调用openSession()
方法获取SqlSession
对象。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
- 使用
sqlSession
对象获取UserMapper
接口,并调用insertUser()
方法插入多条记录。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = new ArrayList<>();
userList.add(new User("user1", 20));
userList.add(new User("user2", 21));
userList.add(new User("user3", 22));
int result = userMapper.insertUser(userList);
基于 foreach 标签的方式
- 在
UserMapper.xml
文件中定义<insert>
标签,使用foreach
标签将多个插入语句拼接到一起。foreach
标签中的collection
属性指定了传递给该方法的参数,使用item
属性指定集合中元素的名称,使用separator
属性指定多个插入语句之间的分隔符。
<insert id="insertUser">
insert into user(name, age)
values
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
- 使用
SqlSessionFactoryBuilder
创建SqlSessionFactory
对象,并使用Resources.getResourceAsStream()
获取mybatis-config.xml
文件的输入流,并调用openSession()
方法获取SqlSession
对象。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
- 使用
sqlSession
对象获取UserMapper
接口,并调用insertUser()
方法插入多条记录。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = new ArrayList<>();
userList.add(new User("user1", 20));
userList.add(new User("user2", 21));
userList.add(new User("user3", 22));
int result = userMapper.insertUser(userList);
这就是 Mybatis 中三种批量插入数据的方式,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis三种批量插入数据的方式 - Python技术站