我最喜歡的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速成(領域驅動設計速成)》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM