当前位置 博文首页 > 文章内容

    三分恶的博客:解决了一个小问题——读源码真的只是为了应付面试?

    作者:21344 栏目:未分类 时间:2021-11-25 22:20:59

    大家好,我是解决一个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,所以是实体类的字段和数据库字段对应不上。

    但奇怪的在哪,因为我很确定,我的实体类中没有sttus这个字段。

    外事不决问百度,内事不决问同事。

    我问了一下同事,有没有遇到过这个问题?

    —— 遇到过了。

    怎么解决的?

    —— 数据库添加 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的相关原理,没有扒过源码,百度也查不到什么资料。

    平时,学习原理、阅读源码常常发生在什么时候?

    ——准备面试的时候。

    我们虽然常常吐槽面试造火箭,入职拧螺丝,但是,这些造火箭的东西可不止在面试时候有用——

    • 遇到问题救命:日常开发很简单,遇到问题,没有知识储备很可能下不了手。
    • 有机会能顶上:万一有一些有技术含量的工作分派,想做,但是做不了,只能看着分给别人,不得难受死。

    所以,保持学习,注意积累!

    简单的事情重复做,重复的事情认真做,认真的事情创造性地做。

    点赞 、关注 不迷路!咱们下期见!

    cs