文档章节

Mybatis 3.5新特性——Optional支持

吴伟祥
 吴伟祥
发布于 2019/04/08 17:06
字数 947
阅读 238
收藏 3

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

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

WARNING

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

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

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

TIPS

简单起见——

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

Before

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

1
2
3
4
5
@Mapper
public interface UserMapper {
    @Select("select * from user where id = #{id}")
    User selectById(Long id);
}

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

1
2
3
4
5
6
7
8
9
10
11
12
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啦!你的代码可以这么写了:

1
2
3
4
5
@Mapper
public interface UserMapper {
    @Select("select * from user where id = #{id}")
    Optional<User> selectById(Long id);
}

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

1
2
3
4
5
6
7
8
9
10
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 已支持 Optional ,Mybatis Spring Boot Starter 也已跟进,引入如下依赖即可:

1
2
3
4
5
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.0.0</version>
</dependency>

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

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

balabala

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

配套代码

本文转载自:http://www.itmuch.com/other/mybatis-optional-support/

吴伟祥

吴伟祥

粉丝 34
博文 497
码字总数 285677
作品 0
泉州
后端工程师
私信 提问
我最喜欢的Mybatis 3.5新特性——Optional支持

发布有段时间了,终于支持了 ,这么实用的特性,竟然还没人安利……于是本文出现了。 文章比较简单,但非常实用,因为能大量简化恶心的判空代码。 WARNING 由于本文非常简(low)单(比),我相信...

周立_ITMuch
2019/04/24
3.6K
17
Solr 轻量的 Python 应用--Pysolr

Pysolr,是基于Python的Apache Solr轻量级封装。它提供了服务器查询并返回基于查询的结果接口。 特性: 基本功能,选择、更新和删除 索引优化 超时支持 使用环境: Python 2.7 - 3.5 Request...

匿名
2016/09/07
3.9K
0
Eclipse 3.7(代号Indigo)正式版发布!

遵循Eclipse的年度发布惯例,Eclipse 3.7(代号Indigo)正式版发布了。 今年,62个Eclipse项目将同时随着Indigo一起发布。 Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开...

noday
2011/06/29
811
0
Android Studio 3.5: 稳步推进 Project Marble 计划

作者: Jamal Eason, Android 产品经理 您是否曾希望 Android Studio 可以速度更快、性能更优、效率更高?如是的话,请立即下载最新的 Android Studio 3.5!您将会体验到前所未有的稳定版 An...

Android_开发者
2019/08/29
0
0
java8的重要特性及其他,昨天答应的发java8╭(╯ε╰)╮

【注意】本文节选自是 DZone 指南 Java 生态系统的专题文章,作者Trisha Gee是Java资深工程师和布道者。在本文中,Trisha Gee阐述了Java 8的重要特性以及使用的原因,由OneAPM工程师翻译。 ...

默默学习中
2016/03/28
1.5K
9

没有更多内容

加载失败,请刷新页面

加载更多

Serverless 的喧哗与骚动(一)附Serverless行业发展回顾

作者 | 阿里中间件高级技术专家 许晓斌 《Maven实战》作者,曾负责 AliExpress 微服务架构演进,现在负责阿里集团 Serverless 技术研发落地。 导读:从 2016 年 AWS 发布 Lambda 以来,全世界...

阿里巴巴云原生
39分钟前
154
0
MySQL实战学习(二)

MySQL实战学习(二) MySQL中两种重要的日志 redo log 当数据库有一条记录需要更新时,InnoDB引擎会先把记录写到redolog中,同时更新内存。这个时候就算是更新完成了,同时,InnoDB会在适当时...

旺仔没馒头
44分钟前
37
0
12306智能刷票

代码下载: https://github.com/testerSunshine/12306 主要配置:TickerConfig.py Linux chrome安装: (chrome获取地址: https://www.chrome64bit.com/index.php/google-chrome-64-bit-for......

Hzhodor
46分钟前
42
0
ActiveMQ学习之SpringBoot整合ActiveMQ------>整合生产者

一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</a......

冥焱
48分钟前
46
0
spring cloud gateway websocket 路由底层实现

最近再弄soul网关,发现soul网关中的websocket插件路径和项目中的不匹配,重写弄了个websocket插件,顺便把gateway中的websocket看了一下,直接开撸 一、WebsocketRoutingFilter 解析 初始化...

普普通通的小斌
55分钟前
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部