大家好,我是解決一個bug,產生三個bug的程序員,所以大家都叫我三bug。
前一陣子我又解決了一個bug,看看是什么情況吧!
問題現場
我正在愉快地寫bug,寫完之后測bug,結果發現了一個bug:
java.sql.SQLException: xxxx : Column 'status' not found in any table
我們的ORM框架使用的是MybatisPlus,這個問題是在我使用這個apid時產生的:
this.baseMapper.selectBatchIds(ids);
問題分析
這個bug也很清晰,有一個字段 status 沒有找到。
因為用的是MP封裝的方法,沒有自己寫xml,所以是實體類的字段和數據庫字段對應不上。
但奇怪的在哪,因為我很確定,我的實體類中沒有status這個字段。
外事不決問百度,內事不決問同事。
我問了一下同事,有沒有遇到過這個問題?
—— 遇到過了。
怎么解決的?
—— 數據庫添加 status字段。
問題到這就結束了嗎?當然沒有。我們的數據庫設計都是定好規范的,憑白往里面添加一個字段,這種解決方式是我不能接受的。

問題的突破口在哪?
要搞清楚sttus 到底是定義在哪的。我在Idea里全局搜索了一下,沒有搜索到。
但是仔細查看了一下實體類,
extends EcEntity
嗯,他還有一個父類。
點進去看一下,這個類有五個字段:createUser、createTime、updateUser、updateTime、delFlag。
還是沒有status,別急,這個類還有個父類。
extends BaseEntity
點進去一看:
public abstract class BaseEntity implements Serializable {
@ApiModelProperty("業務狀態")
private Integer status;
……
}
破案了,原來status是在這兒。為什么搜不到,原來是封在了jar包里。

問題解決
status 找到了,咱也動不了。
問問架構組同學這個字段是干什么的。
—— 有些業務數據庫設計里用上了這個字段,所以抽取出來。
好吧,可是,我們用不上啊。
難道非得數據庫里加上這么一個用不上的字段?

當然不用,我之前看過MP的官方文檔,里面有個注解的屬性我稍微還有點印象。
什么屬性呢?
查一下官方文檔,就是它—— @TableField(exist = false)。
這個屬性是用來干什么的呢?是用來標識實體類中的非表字段的。
在我的實體類中添加:
@TableField(exist = false)
private Integer status;
OK,問題解決。
解決問題的我紅光滿面,站起來,腆着肚子:
"各位老哥,過來一下。"
召集了小組的同事,把這個問題給他們一講,豪橫地說道:
“把數據庫里加的字段都給我刪了,都按我的來。”
同事一臉欽佩,“這個問題你是怎么想到的?”
我歪嘴一笑——“實力!”

三之感想
好了,這個簡單的小問題就處理完了。
問題很簡單,也有其它不太優雅的處理方式。
但是我們小組里其它同事都沒有找到問題的原因和合適的處理方式,而我找到了呢?
- 我稍微閱讀過一點jdk的源碼,所以不怵扒源碼
- 我知道MP是我們新項目主要用的ORM框架,把官方文檔過了一遍
這兩個條件缺一個,我可能就沒法以上面說的方式解決這個問題,而是以百度到的,數據里添加字段來解決。
這只是很小的一個問題,但是放大來看,有時候我們做重復性工作的時候想一想:
你抱怨每天都在crud,是不是你只有crud的能力呢?

當然不是在座的各位,是說我自己。
就像上面的問題,是架構組的同事封裝MybatisPlus留的一個坑。我也不敢吐槽,因為我沒那個實力。
假如他們做的這個需求給我:優化和封裝開源框架MybatisPlus。
我也干不了,因為不了解MP的相關原理,沒有扒過源碼,百度也查不到什么資料。
平時,學習原理、閱讀源碼常常發生在什么時候?
——准備面試的時候。
我們雖然常常吐槽面試造火箭,入職擰螺絲,但是,這些造火箭的東西可不止在面試時候有用——
- 遇到問題救命:日常開發很簡單,遇到問題,沒有知識儲備很可能下不了手。
- 有機會能頂上:萬一有一些有技術含量的工作分派,想做,但是做不了,只能看着分給別人,不得難受死。
所以,保持學習,注意積累!
簡單的事情重復做,重復的事情認真做,認真的事情創造性地做。
點贊、關注不迷路!咱們下期見!
