转载是一种动力 分享是一种美德
你是否也跟我一样,每天都挤一个小时的地铁去上班?要是让我说说挤广州3号线地铁感受,我可以写一篇三千字作文。今天在地铁上我看到这样一幕,让我感觉有点寒。一位老奶奶在人群中挤着,我给她让了下路,让她往有座位的地方去站,希望能有人给他让座吧,可以直到我下车回头一看,她还是抱着根支柱在挨着站着。
公司项目没有文档,做为新人的我,纯靠看代码理解,很是头疼。大致的业务流程不难从代码中看出,但是一些细节性的还真的很难直接找到对应的代码。如果是简单的web应用那还好说,关键是有很多的定时任务以及由sh脚本调用执行的任务,这些代码是直接与其它业务代码(web应用)脱节的,想要看懂也并非易事。因此我在此总结此次代码分析流程。
分析什么
今天在分析项目中处理url回传调用记录这一块的功能,我发现数据库中有很多的以日期结尾的且表结构相同的表,而实际上微服务只是接收回传请求将请求写入一张tmp_xxx_log表,那么我就好奇了,是什么时候将这张tmp_xxx_log表的记录插入到log_xxx表以及log_xxx_total表的,又是什么时候将记录插入log_xxx_20190101这种以日期结尾的表的。
待分析的问题:我想查看某个以日期结尾的表是什么时候创建,这种每天都产生一个新的表的不可能是在数据库直接执行sql语句创建,要么是触发器触发创建的,要么就是在项目中用代码创建的。
是否是触发器创建的
我首先排除是否是使用触发器创建的。可以使用sql语句查询当前数据库创建了哪些触发器,也可以有目的性的查看哪张表下创建了触发器。
于是我是找到了一个触发器,但是不是用来创建表的,该触发器的任务是在往log_xxx表insert记录的时候触发执行,任务是往log_xxx_total表也添加同样的一条记录。所以到此可以排除是触发器创建的这些表的可能。
顺便介绍一下查询触发器的相关sql吧。
在项目中找
项目那么大,在哪个模块中创建的都不知道,说实话,有些模块是做什么的我现在都还不知道,其实还有一个最简单的办法:不懂就问呗。我一般问问题只会问业务方面的问题,这种问题就是自己能力的问题,所以还是选择自己分析,这样也能提升代码的阅读能力。
因为数据持久层使用的是Mybatis框架,所以跟表操作直接关联的就是Mapper.xml文件。项目中的Mapper文件命名很规范,可以直接根据表名找到对应的Mapper文件,这就好办了。先从Mapper文件中找到创建以日期结尾的表的sql语句,找到这个标签,获取到其id,我找到的id是"createDailyTable",然后根据这个id找到与该Mapper文件对应的接口,找到createDailyTable方法。找到这一步后面的也就容易了。鼠标选中这个方法名,按control+option+h获取到这个方法在哪里被调用的。结果如图:
怎么样,这个方法不错吧,找到了调用dao接口的createDailyTable创建表方法的类型,而且还知道了是哪个方法调用的,这时可以直接鼠标点击这个方法查看代码,也可以全局搜索类,接着就是分析代码。只要找到了创建表的类及方法就不难从代码中分析出其数据的插入是在哪里插入及什么时机插入的。
这个方法适用的前提是mybatis的Mapper文件及接口的方法名命名必须要规范。虽说项目没有文档,但只要命名规则很容易就能从数据库表名看出这个表是存什么数据的、这个Mapper文件是处理哪些相关表的增删改查的、Mapper表与哪个dao接口对应的、接口中定义的方法是做什么的。我还是建议业务逻辑强的地方需要添加注释,最好就是写个文档,特别是哪些与业务代码脱节的quartz定时调度任务。
-----
-----
▼
领取专属 10元无门槛券
私享最新 技术干货