我最喜歡的Mybatis 3.5新特性——Optional支持

Mybatis 3.5 發佈有段時間了,終於支持了 Optional ,這麼實用的特性,居然還沒人安利……因而本文出現了。git

文章比較簡單,但很是實用,由於能大量簡化噁心的判空代碼。github

WARNINGredis

因爲本文很是簡(low)單(比),我相信又會有相似以下的大佬出現(最近莫名其妙地被若干大佬噴,也不知道得罪誰了,必須高能預警一下,省得髒了大佬們的眼睛):spring

  • 嫌低級噴:」這麼簡單文章也好意思寫,沒有源碼分析好意思拿出來!」——我源碼分析的文章也有小几十篇了,閱讀量更差。並且我寫文也不純粹迎合觀衆,我以爲有用,有價值,就總結下,之後本身也好備忘,僅此而已。
  • 秀優越感噴:」你的文章沒有價值,看看我這篇」——真人真事,在某技術羣討論,吐槽了一圈後,貼出本身同類文章(帶源碼分析),對這種只能獻上本身的膝蓋,尊稱100聲大佬。
  • 無腦噴:」你的文章就是一坨屎」——你纔是一坨屎,沒人逼着你看啊,本身找不開心啊咋地。

OK,預防針打過了,開始正文吧——編程

TIPSmybatis

簡單起見——app

  • 本文直接用Mybaits的註解式編程,不把SQL獨立放在xml文件了
  • 省略Service,直接Controller調用DAO

Before

相信你們使用Mybatis時代碼是這樣寫的:spring-boot

@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啦!你的代碼能夠這麼寫了:this

@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 已支持 OptionalMybatis 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圈子的潮流。

配套代碼

本文首發

http://www.itmuch.com/other/mybatis-optional-support/

乾貨分享

乾貨分享

相關文章
相關標籤/搜索