当前使用版本(必须填写清楚,否则不予处理)

3.0.1

该问题是怎么引起的?(最新版上已修复的会直接close掉)

不算是错误,就是有个疑问,如下: IService自带的save方法,查看了源码,发现根据insert返回的插入条数来判断,如果等于0,则false,否则true。但何时会插入结果条数为0?经测试,save(null) 也会返回true,如果插入异常,如字段长度超限制,这种会直接返回sql异常,不会返回false。所以有了这个疑问,希望大佬解答,万分感谢。

重现步骤

直接调用api save即可

报错信息

无报错

Comment From: nieqiurong

返回0的特殊情况,比如 insert ignore.

Comment From: Jump-Boy

返回0的特殊情况,比如 insert ignore.

@nieqiurong 大佬好,我看save 底层调用的是insert,save不会出现insert ignore的情况吧?我是这么理解的

Comment From: SunJiFengPlus

返回0的特殊情况,比如 insert ignore.

我也有个类似的问题, 这些 CRUD 的方法, 在调用的时候根据执行结果进行对应的操作, 执行成功了怎样怎样, 执行失败了怎样怎样. 有些疑惑执行失败之后的操作会不会永远执行不到, 是不是用 try-catch 块包住才能体现调用失败的语义?


和同事讨论了许久, 他始终觉得执行失败就是以方法返回的方式通知, 我也看了部分源码, 还是云里雾里的, 想请教一下下面这两种情况该怎么选择? 到底是返回值能决定执行成功失败 还是 try-catch 能决定执行成功失败?

// case 1
boolean result = someService::update(updateWrapper);
if (result) {
    // do something
} else {
    // do something
}

// case 2
try {
    someService::update(updateWrapper);
} catch(Exception e) {
    // do someting
}

Comment From: nieqiurong

返回0的特殊情况,比如 insert ignore.

@nieqiurong 大佬好,我看save 底层调用的是insert,save不会出现insert ignore的情况吧?我是这么理解的

支持xml重写的,也支持注入更改的,所以不能排除,但这种判断还和执行有关,如果遇到批量执行器,返回的结果就不是0和1了。

Comment From: nieqiurong

返回0的特殊情况,比如 insert ignore.

我也有个类似的问题, 这些 CRUD 的方法, 在调用的时候根据执行结果进行对应的操作, 执行成功了怎样怎样, 执行失败了怎样怎样. 有些疑惑执行失败之后的操作会不会永远执行不到, 是不是用 try-catch 块包住才能体现调用失败的语义?

和同事讨论了许久, 他始终觉得执行失败就是以方法返回的方式通知, 我也看了部分源码, 还是云里雾里的, 想请教一下下面这两种情况该怎么选择? 到底是返回值能决定执行成功失败 还是 try-catch 能决定执行成功失败?

```java // case 1 boolean result = someService::update(updateWrapper); if (result) { // do something } else { // do something }

// case 2 try { someService::update(updateWrapper); } catch(Exception e) { // do someting } ``` 返回值在非批量执行器下是返回当前操作(排除查询)下的影响记录行数,比如,你根据某个条件删除一批数据,如果驱动没bug的情况下,返回值等同于匹配数据行数,这个就和你方式一代码匹配,但如果你匹配的记录下,存在外键约束情况下,这个时候你删除操作就会出现sql异常,如果你认为sql异常你需要忽略,就需要按你方式二的代码编写。

Comment From: SunJiFengPlus

返回0的特殊情况,比如 insert ignore.

我也有个类似的问题, 这些 CRUD 的方法, 在调用的时候根据执行结果进行对应的操作, 执行成功了怎样怎样, 执行失败了怎样怎样. 有些疑惑执行失败之后的操作会不会永远执行不到, 是不是用 try-catch 块包住才能体现调用失败的语义? 和同事讨论了许久, 他始终觉得执行失败就是以方法返回的方式通知, 我也看了部分源码, 还是云里雾里的, 想请教一下下面这两种情况该怎么选择? 到底是返回值能决定执行成功失败 还是 try-catch 能决定执行成功失败? ```java // case 1 boolean result = someService::update(updateWrapper); if (result) { // do something } else { // do something }

// case 2 try { someService::update(updateWrapper); } catch(Exception e) { // do someting } ```

返回值在非批量执行器下是返回当前操作(排除查询)下的影响记录行数,比如,你根据某个条件删除一批数据,如果驱动没bug的情况下,返回值等同于匹配数据行数,这个就和你方式一代码匹配,但如果你匹配的记录下,存在外键约束情况下,这个时候你删除操作就会出现sql异常,如果你认为sql异常你需要忽略,就需要按你方式二的代码编写。

感谢回复