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[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速成(領域驅動設計速成)》