zoukankan      html  css  js  c++  java
  • 解决了一个小问题——读源码真的只是为了应付面试?

    大家好,我是解决一个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
    

    嗯,他还有一个父类。

    点进去看一下,这个类有五个字段:createUsercreateTimeupdateUserupdateTimedelFlag

    还是没有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的相关原理,没有扒过源码,百度也查不到什么资料。

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

    ——准备面试的时候。

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

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

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

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

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

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/three-fighter/p/15089463.html
Copyright © 2011-2022 走看看