当前使用版本(必须填写清楚,否则不予处理)
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异常你需要忽略,就需要按你方式二的代码编写。
感谢回复