🎪/背景
springboot data jpa 版本在 之前1.5x的是findOne
通过主键查询一条数据
而在2.5里面 findOne
是查询符合条件的一条数据,主键查询又改回findById
了
而且findById 不直接返回实体对象
了,而是Optional<实体对象>
对象
Optional对象是jdk1.8以后才支持
,所以要使用jpa2.5x需要至少jdk1.8或以上。
🎃/ 问题:什么是Optional
Optional主要是针对null值处理
也就是所有程序中最常见的异常,空指针异常
(null没有任何属性和方法,任何调用他的属性都会报错
,而任何对象都可能是null,编译器无法确定变量的值是否为null而做出提示 =,=)
而Optional
就是专门处理null值的,对于任何可能为null的值,都可以包装起来,方便对空值情况处理,避免大量的==null
, !=null
潘墩,程序更加的优美了,能有效的避免了对象为空的情况(因为别人给你的接口就是返回的 Optional)。
🎡 / 常见的使用方法
之前我就知道Optional,但是实际开发中基本不用 (狗头-,-)
因为我原来的工程直接返回的就是基本对象,大部分的程序员都还没有使用Optional的习惯,你不一定能说服所有人(-,-)
而且代码改动是一件麻烦的事情,容易出问题,而且工作量很大
但是当框架已经使用这样的结构之后,你不得不去适应的时候,你可以发现你的程序的健壮性大大提升了,而且真正的使用过后发现真香。🧜♀️(+_+ 而且新项目直接使用就不会有上述的问题)
先给个示例方法调用
//查询用户
Optional<UserDO> userOptional = userRepository.findById(param.getUserId());
1、对空值做异常处理的,拿到对象的(常用)
UserDO userDO = userOptional.orElseThrow(() ->
ViewCodeUtils.toException(ViewResultCodeEnum.USER_NOT_EXIST)
);
自带的抛出异常的处理机制,返回异常对象即可
上面我使用了枚举异常,最后返回的是异常对象,和下面的效果一致。
UserDO userDO = activeOptional.orElseThrow(() ->
new RuntimeException("用户不存在"));
等同于原来的代码
if(user == null){
throw new RuntimeException("用户不存在");
}
2、只处理有值的,对空值不处理,使用ifPresent
即可
userOptional.ifPresent(p-> System.out.println(p.getActivityId()));
如果为空则不会执行,一般数据筛选的时候可以用。
等同于原来的代码
if(user != null){
System.out.println(user.getActivityId())
}
3、空值判断,isPresent,存在则返回true
if (!userOptional.isPresent()){
throw ViewCodeUtils.toException(ViewResultCodeEnum.USER_NOT_EXIST);
}
UserDO userDO = userOptional.get();
查看源码,实现非常简单。就是为了避免直接写==null
和!=null
(据说是因为有些人 少写了一个=
号,变成了 user = null
,所以有些写法推荐为 null == user
,当然还是不推荐写 ==
)
//源码
public boolean isPresent() {
return value != null;
}
判读为空的处理之后就可以通过.get()
获取值,那可能会问了,我就喜欢==null判断,能拿出来再处理么?我们看下源码
//源码
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
很明显,为了让你用提供的方法,是不会让你先把值拿出来的,这样就失去了这个类的意义。所以还是要先判空处理哦。
4、空值则补全
UserDO userDO = userOptional.orElse(new UserDO());
这个方法不常用,因为你将无法区分这个对象是你原本的还是你创建出来的(除非你不在乎它的来源,或者其他作用)
当然你可以在你创建的对象上做一点手脚,比如某个字段标记为自动创建,但是你需要单独一个字段去维护,当然如果你不需要区分的时候,是个不错的方法。
👓 /总结
Optional是避免空值而生的对象,对空值的情况提供了对应的现成的解决方案,避免手写空判断导致的问题,可能开始的时候不习惯,你需要有使用的环境,比如升级jpa的版本到2.5x,或者其他的框架升级下版本,可能就会提供给你Optional,使用的方法也非常简单,相信都写一遍就能快速掌握。
总结一下常用的方法,给需要学习的人节约时间,biu👨🏼🍳