mybatis操作oracle执行批量操作时为什么返回-1,如何让它返回实际影响行数?
时间: 2024-03-16 22:43:04 浏览: 47
在使用MyBatis执行Oracle批量操作时,可能会出现返回-1的情况。这是因为Oracle对于批量更新操作,返回的是SQL语句的执行次数,而不是实际影响的行数。
为了让MyBatis返回实际影响行数,可以在Mapper.xml文件中的对应语句的<selectKey>标签中设置useGeneratedKeys="true"和keyProperty属性,将数据库自动生成的主键值设置到对象中,然后在执行批量操作之前,先执行一条查询语句,获取到主键值。这样,在执行批量操作时,MyBatis就可以正确地返回实际影响行数了。
例如,在Mapper.xml文件中的对应语句中添加如下代码:
```
<selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER" useGeneratedKeys="true">
SELECT SEQ_ID.NEXTVAL FROM DUAL
</selectKey>
```
其中,keyProperty属性指定了对象中要设置主键值的属性名,resultType指定了主键值的类型,order属性指定了查询语句的执行顺序,useGeneratedKeys属性设置为true表示要使用数据库自动生成的主键值。这样,就可以在执行批量操作之前,先执行一条查询语句,获取到主键值,然后在执行批量操作时,MyBatis就可以正确地返回实际影响行数了。
相关问题
mybatis 批量更新返回影响行数
在 MyBatis 中进行批量更新时,可以使用 `SqlSession` 的 `update` 方法来执行更新操作,并通过返回值获取影响的行数。
具体步骤如下:
1. 获取一个 `SqlSession` 对象。
2. 创建一个包含多个更新语句的 `List`。
3. 使用 `SqlSession` 的 `update` 方法执行批量更新,传入更新语句的 ID 和更新参数。
4. 通过返回的整数值,获取到批量更新的总影响行数。
下面是一个示例代码:
```java
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
List<YourObject> objectList = new ArrayList<>();
// 填充 objectList
int totalAffectedRows = 0;
for (YourObject object : objectList) {
int affectedRows = sqlSession.update("yourNamespace.updateStatementId", object);
totalAffectedRows += affectedRows;
}
sqlSession.commit();
System.out.println("Total affected rows: " + totalAffectedRows);
}
```
以上代码中,`yourNamespace` 是你在 MyBatis 配置文件中定义的命名空间,`updateStatementId` 是相应更新语句的 ID。
mybatis操作oracle批量更新语句
以下是使用MyBatis操作Oracle进行批量更新的示例代码:
1. 定义Mapper接口
```java
public interface UserMapper {
void updateUsers(@Param("users") List<User> users);
}
```
2. 定义XML映射文件
```xml
<!-- updateUsers批量更新语句 -->
<update id="updateUsers" parameterType="java.util.List">
<foreach collection="users" item="user" separator=";">
update users set name=#{user.name}, age=#{user.age} where id=#{user.id}
</foreach>
</update>
```
3. 调用Mapper方法
```java
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = new ArrayList<>();
users.add(new User(1, "Tom", 18));
users.add(new User(2, "Jerry", 20));
userMapper.updateUsers(users);
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
sqlSession.close();
}
```
在以上示例中,我们使用了MyBatis的foreach标签来批量更新数据。其中,collection属性指定了要批量更新的数据列表,item属性指定了当前循环变量,separator属性指定了每条更新语句之间的分隔符。注意,在批量更新时,需要使用SqlSession的BATCH执行器来优化性能,并且需要手动提交事务。