mybatis oracle 批量插入返回对象
时间: 2023-07-03 17:17:47 浏览: 227
Java实现mybatis批量插入数据到Oracle
在 MyBatis 中进行批量插入操作时,如果你想要返回插入后的对象,可以通过两种方式实现。
第一种方式是在插入 SQL 语句中使用 RETURNING 子句,返回插入后的结果集。具体步骤如下:
1. 在 MyBatis 的映射文件中编写插入语句,使用 RETURNING 子句返回插入后的结果集,例如:
<insert id="batchInsertUsers" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
insert into USER (NAME, AGE) values (#{name}, #{age})
returning ID, NAME, AGE into #{id}, #{name}, #{age}
</insert>
2. 在 Java 代码中调用插入方法时,使用 MyBatis 的 ExecutorType.BATCH 执行器类型,并在插入方法的参数中传入一个空的结果集,例如:
List<User> users = new ArrayList<>();
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.batchInsertUsers(users);
sqlSession.commit();
} finally {
sqlSession.close();
}
3. 在插入方法执行完毕后,你可以在结果集中获取插入后的对象,例如:
for (User user : users) {
System.out.println(user.getId() + " " + user.getName() + " " + user.getAge());
}
第二种方式是使用 Oracle 的 RETURNING INTO 语句将插入后的数据存入一个临时表中,然后再通过查询临时表的方式获取插入后的数据。具体步骤如下:
1. 在 Oracle 中创建临时表,例如:
create global temporary table TEMP_USER (ID number, NAME varchar2(20), AGE number) on commit preserve rows;
2. 在 MyBatis 的映射文件中编写插入语句,使用 RETURNING INTO 语句将插入后的数据存入临时表中,例如:
<insert id="batchInsertUsers" parameterType="java.util.List">
declare
type USER_LIST is table of USER%rowtype;
l_users USER_LIST := USER_LIST();
begin
for i in 1..l_users.count loop
insert into USER (NAME, AGE) values (l_users(i).NAME, l_users(i).AGE)
returning ID into l_users(i).ID;
end loop;
forall i in 1..l_users.count
insert into TEMP_USER values (l_users(i).ID, l_users(i).NAME, l_users(i).AGE);
end;
</insert>
3. 在 Java 代码中调用插入方法时,使用 MyBatis 的 ExecutorType.BATCH 执行器类型,并在插入方法的参数中传入一个空的结果集,例如:
List<User> users = new ArrayList<>();
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.batchInsertUsers(users);
sqlSession.commit();
} finally {
sqlSession.close();
}
4. 在插入方法执行完毕后,你可以通过查询临时表的方式获取插入后的数据,例如:
List<User> insertedUsers = sqlSession.selectList("select * from TEMP_USER");
for (User user : insertedUsers) {
System.out.println(user.getId() + " " + user.getName() + " " + user.getAge());
}
这两种方式都可以实现在 MyBatis 中进行批量插入操作,并返回插入后的对象。你可以根据自己的需求选择其中一种方式。
阅读全文