我最喜欢的Mybatis 3.5新特性——Optional支持
2019-04-24 10:11
337 查看
Mybatis 3.5
发布有段时间了,终于支持了 Optional
,这么实用的特性,竟然还没人安利……于是本文出现了。
文章比较简单,但非常实用,因为能大量简化恶心的判空代码。
WARNING
由于本文非常简(low)单(比),我相信又会有类似如下的大佬出现(最近莫名其妙地被若干大佬喷,也不知道得罪谁了,必须高能预警一下,免得脏了大佬们的眼睛):
- 嫌低级喷:”这么简单文章也好意思写,没有源码分析好意思拿出来!”——我源码分析的文章也有小几十篇了,阅读量更差。而且我写文也不纯粹迎合观众,我觉得有用,有价值,就总结下,以后自己也好备忘,仅此而已。
- 秀优越感喷:”你的文章没有价值,看看我这篇”——真人真事,在某技术群讨论,吐槽了一圈后,贴出自己同类文章(带源码分析),对这种只能献上自己的膝盖,尊称100声大佬。
- 无脑喷:”你的文章就是一坨屎”——你才是一坨屎,没人逼着你看啊,自己找不开心啊咋地。
OK,预防针打过了,开始正文吧——
TIPS
简单起见——
- 本文直接用Mybaits的注解式编程,不把SQL独立放在xml文件了
- 省略Service,直接Controller调用DAO
Before
相信大家使用Mybatis时代码是这样写的:
@Mapper public 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啦!你的代码可以这么写了:
@Mapper public interface UserMapper { @Select("select * from user where id = #{id}") Optional<User> 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
已支持 Optional
,Mybatis Spring Boot Starter
也已跟进,引入如下依赖即可:
<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圈子的潮流。
配套代码
- GitHub:https://github.com/eacdy/spring-boot-study/tree/master/spring-boot-mybatis-optional
- Gitee:https://gitee.com/itmuch/spring-boot-study/tree/master/spring-boot-mybatis-optional
本文首发
http://www.itmuch.com/other/mybatis-optional-support/
干货分享
(adsbygoogle = window.adsbygoogle || []).push({});
相关文章推荐
- myBatis+oracle11g insert语句报错17023 不支持的特性
- IE旧版本如何让HTML4转换并且支持HTML5的新特性。
- Mybatis添加ehcache缓存支持
- Java 8 新特性-菜鸟教程 (6) -Java 8 Optional 类
- VS 2008和.NET 3.5 Beta2新特性介绍(转载)
- [转] Chrome Dev 分支默认将开启扩展支持 扩展特性转正在即
- html5 新特性支持的浏览器检测
- Node 对 ES6 新特性 支持情况
- jdk1.6新特性---支持javascript
- [Regex]Greta不支持“Named Groups”特性
- Chronon 3.5 发布,支持 Java 7
- Silverlight 5 Beta新特性[6]低延迟对WAV格式声音效果支持
- Mybatis加入Ehcache支持
- PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的
- Visual Studio, GCC, Clang, Intel 对 C++11 特性的支持一览表
- 让Faster R-CNN支持TX1的fp16(half float, float16)特性
- Oracle 12c 新特性之varchar2长度最大值支持到32767
- 那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性 ——神经网络API,Kotlin支持
- 使用xmake检测编译器特性支持
- Mybatis3.4.0不支持mybatis-spring1.2.5及以下版本