我最喜欢的Mybatis 3.5新特性!超实用!
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 {@Autowiredprivate 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<User> selectById(Long id);}
然后,业务代码可以变成这样:
public class UserController {@Autowiredprivate 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[1] ,及其配套的 通用Mapper专用生成器[2] 都尚未支持Optional ,笔者提Issue,详见:建议支持Optional[3] ,其实想支持很简单,只需稍作修改即可。看最近时间,考虑提交PR。
balabala
Spring Data(jpa、redis、mongo…)花了很大力气重构(很多包名都换了,API名称也改了),率先支持了 Optional ,不得不说,在Java世界, Spring 确实走在前面,引领着Java圈子的潮流。
配套代码
•GitHub[4]•Gitee[5]
干货分享
最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!
•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》
我最喜欢的Mybatis 3.5新特性!超实用!的更多相关文章
- 6个小而美的es6新特性
译者:动静若参商 译文:http://www.zcfy.cc/article/1795 原文:https://davidwalsh.name/es6-features JavaScript社区中的每个 ...
- 【JS】380- JavaScript 正则新特性
概括 如果你曾用 JavaScript 进行过复杂的文本处理操作,那么你将会喜欢 ES2018 中引入的新特性.本文将详细介绍第9版标准如何提高 JavaScript 的文本处理能力. 大多数编程语言 ...
- 我最喜欢的visual studio 2013的新特性
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:我最喜欢的visual studio 2013的新特性.
- Atitit mybatis 3 3.2 3.3 3.4 新特性attilax总结
Atitit mybatis 3 3.2 3.3 3.4 新特性attilax总结 1.1. iBATIS 3 内的新特性.html1 1.2. MyBatis团队于2013年2月21日正式发布 M ...
- TKmybatis的框架介绍和原理分析及Mybatis新特性
tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...
- MyBatis 3.5.2 新特性介绍
1.MyBatis 最新版本 3.5.2 发布 MyBatis最新版本是:3.5.2,发布时间是:2019年7月15日 2.MyBatis 3.5.2 新特征介绍 我们知道,MyBatis 是支持定制 ...
- TKmybatis的框架介绍和原理分析及Mybatis新特性演示
tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...
- es6 新特性2
es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...
- C#6新特性,让你的代码更干净
前言 前几天看一个朋友的博客时,看他用到了C#6的特性,而6出来这么长时间还没有正儿八经看过它,今儿专门看了下新特性,说白了也不过是语法糖而已.但是用起来确实能让你的代码更加干净些.Let's try ...
随机推荐
- Python Learning - Three
1. Set Set is a collection which is unordered and unindexed. No duplicate members In Python sets ar ...
- Ubuntu16.04更新python3.5到python3.7
下载wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1rc2.tgz 解压tar zxvf Python-3.7.1rc2.tgzcd ...
- pip3更新后install package出现ImportError: cannot import name 'main'
linux下pip3更新后,install包出现main不能导入的情况: bear@bear:~/eclipse-workspace/Python-toolbox$ pip3 install pycr ...
- masonry布局说明
这个要根据情况而定,有时会很有用的. setContentHuggingPriority: 优先级越高,代表压缩越厉害,越晚被拉伸.就是上图中那人拉的力量更强. setContentCompressi ...
- iOS8之后搜索框的常规实例
1.在一个二级导航控制器中添加一个UITableviewController作为子控制器 2.UITableviewController.tableView 作为展示结果 3.利用iOS之后的UISe ...
- Multi-Projector Based Display Code ------- Home
Overview This project provides you with the tools and techniques you need to create your own large-a ...
- 干货|爱奇艺CDN巡检系统技术解析
小结: 1. 中心处理系统 /1/将定制后的巡检任务拆分,通过配置与任务分发系统.CMDB*( configuration management database)将派发到边缘拨测系统/2/处理边缘拨 ...
- 关于VMware(虚拟机) 出现错误时处理办法
我们在开发中难免会用到虚拟机.前段时间老有同学问我虚拟机报错解决办法,趁今天有空特随笔. 错误如下图 首先科普下VT是个啥? Intel VirtualTechnology(VT)既“虚拟化技术” V ...
- Node.js、npm、vue-cli 的安装配置环境变量
我安装node.js是为了学习vue,需要用到npm,所以就把node.js安装了,安装node.js会带有npm的安装. 在安装node.js之前,我们需要了解以下三个内容. npm: Nodejs ...
- 如何让外网访问自己的本地Web服务
目前很多网站开发者安装了IIS或者Apache等Web服务器,可以把自己电脑配置成一以路由为中心的内网服务器. 本地服务器在内网测试是绰绰有余的,但是有些项目需要演示给异地的客户验收,而又赶不及把自己 ...