博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我最喜欢的Mybatis 3.5新特性——Optional支持
阅读量:5742 次
发布时间:2019-06-18

本文共 2143 字,大约阅读时间需要 7 分钟。

  hot3.png

Mybatis 3.5 发布有段时间了,终于支持了 Optional ,这么实用的特性,竟然还没人安利……于是本文出现了。

文章比较简单,但非常实用,因为能大量简化恶心的判空代码。

WARNING

由于本文非常简(low)单(比),我相信又会有类似如下的大佬出现(最近莫名其妙地被若干大佬喷,也不知道得罪谁了,必须高能预警一下,免得脏了大佬们的眼睛):

  • 嫌低级喷:”这么简单文章也好意思写,没有源码分析好意思拿出来!”——我源码分析的文章也有小几十篇了,阅读量更差。而且我写文也不纯粹迎合观众,我觉得有用,有价值,就总结下,以后自己也好备忘,仅此而已。
  • 秀优越感喷:”你的文章没有价值,看看我这篇”——真人真事,在某技术群讨论,吐槽了一圈后,贴出自己同类文章(带源码分析),对这种只能献上自己的膝盖,尊称100声大佬。
  • 无脑喷:”你的文章就是一坨屎”——你才是一坨屎,没人逼着你看啊,自己找不开心啊咋地。

OK,预防针打过了,开始正文吧——

TIPS

简单起见——

  • 本文直接用Mybaits的注解式编程,不把SQL独立放在xml文件了
  • 省略Service,直接Controller调用DAO

Before

相信大家使用Mybatis时代码是这样写的:

@Mapperpublic interface UserMapper {    @Select("select * from user where id = #{id}")    User selectById(Long id);}

然后,业务代码是这样写的:

public class UserController {    @Autowired    private UserMapper userMapper;    @GetMapping("/{id}")    public User findById(@PathVariable Long id) {        User user = this.userMapper.selectById(id);        if(user == null) {          // 抛异常,或者做点其他事情        }    }}

After

Mybatis 3.5支持Optional啦!你的代码可以这么写了:

@Mapperpublic interface UserMapper {    @Select("select * from user where id = #{id}")    Optional
selectById(Long id);}

然后,业务代码可以变成这样:

public class UserController {    @Autowired    private UserMapper userMapper;    @GetMapping("/{id}")    public User findById(@PathVariable Long id) {        return this.userMapper.selectById(id)                .orElseThrow(() -> new IllegalArgumentException("This user does not exit!"));    }}

从此,再也不需要像以前一样写一大堆代码去判断空指针了

至于 Optional 怎么使用,本文不作赘述——JDK 12都发布了,你要我普及JDK 8的”新特性”吗?大家自行百度吧,百度很多了。关键词:Java 8 Optional

思考

Mybatis 已支持 OptionalMybatis Spring Boot Starter 也已跟进,引入如下依赖即可:

org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.0

然而,Mybatis 的配套设施尚未跟进——

  • 官方提供的 Mybatis Generator 插件还未跟进,这意味着目前使用该插件生成的代码依然不会返回 Optional ,例如 selectByPrimaryKey ,返回的依然是 实体类 ,而非 Optional<实体类>
  • 国内最流行的第三方Mybaits增强 ,及其配套的 都尚未支持Optional ,笔者提Issue,详见: ,其实想支持很简单,只需稍作修改即可。看最近时间,考虑提交PR。

balabala

Spring Data(jpa、redis、mongo…)花了很大力气重构(很多包名都换了,API名称也改了),率先支持了 Optional ,不得不说,在Java世界, Spring 确实走在前面,引领着Java圈子的潮流。

配套代码

  • GitHub:
  • Gitee:

本文首发

干货分享

干货分享

转载于:https://my.oschina.net/eacdy/blog/3041608

你可能感兴趣的文章
深度学习图像分割(一)——PASCAL-VOC2012数据集(vocdevkit、Vocbenchmark_release)详细介绍...
查看>>
Ubuntu 16.04下搭建基于携程Apollo(阿波罗)配置中心单机模式
查看>>
常用的API接口,返回JSON格式的服务API接口
查看>>
一直被世人误解的薛定谔猫:批判量子力学及其残忍的隐喻
查看>>
iOS - 解决Unable to add a source with url `https://github.com/CocoaPods/Specs.git` named
查看>>
数据结构思维 第四章 `LinkedList`
查看>>
《碟中谍5》背后的生物识别技术大比拼
查看>>
Linux通用KVM自动安装Shell脚本(兼容所有Linux发行版/CentOS/Ubuntu)
查看>>
Docker EE 2.0 版本助力 Kubernetes ,让部署不再复杂!
查看>>
十七年价值传承与技术领先,新华三入门级存储历久弥新
查看>>
「镁客·请讲」FXG Nikk Mitchell:优质VR内容能够带你真正进入细节
查看>>
Theano 中文文档 0.9 - 7.2.1 起手式 —— 代数
查看>>
抠图不再麻烦,Adobe 新算法让 P 图以假乱真
查看>>
爱情刷不走三点钟,区块链里也有“量子”“纠缠”
查看>>
Ubuntu 16.04安装Wireshark进行抓包
查看>>
CentOS下的yum upgrade和yum update区别,没事别乱用,和Ubuntu的update不一样!
查看>>
PostgreSQL控制台以竖行显示
查看>>
量力而行和软硬结合,这才是当下智能制造产业所需要注意的问题
查看>>
2016年人工智能、云计算、大数据版块发展大事记
查看>>
Oracle Supplemental 补全日志介绍
查看>>