zoukankan      html  css  js  c++  java
  • 我最喜欢的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 {    @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<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[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速成(领域驱动设计速成)》

  • 相关阅读:
    在CentOS-6.9里安装openvswitch-2.5.4
    Django 2.0.7 使用小知识
    微信小程序 存储数据到本地以及本地获取数据
    微信小程序目录结构与配置介绍
    微信小程序视图层介绍及用法
    小程序 wx.request请求
    小程序的启动流程(生命周期)
    小程序的双线程模型
    小程序之基础组件
    小程序之路由跳转
  • 原文地址:https://www.cnblogs.com/duwamish/p/10682046.html
Copyright © 2011-2022 走看看