领到需求后欲重构项目,却被导师怒批乱改项目?

1,717 阅读3分钟

大家好,我是橘子皮。

需求场景

最近领到一个新需求,是一个项目的子系统,需要实习从父项目跳转过来后,在子项目中实现不同用户的做题逻辑。具体的内容不便多说~

os:完了嘛这不是,这个系统基于若依开发,就是不算上若依的表,也有60个表,看来工作量不少啊,需要加不少字段了,得加把尽啊,橘子皮!

开发沟通

导师:橘子皮,你打算怎么实现这个需求?

我:我先准备在新建一个表 t,并且将其余的表中,新建一个这个id t_id,用于关联查询;其次准备 修改 dto mapper等。。。

导师:停停停,你这样太麻烦了,这里有60多个表,一个 mapper 中 有十几个方法,这样下来你需要修改多少内容,太累了,有没有更简单的方法?

我:还有更简单的方法。。。吗?

导师:你去看看 MyBatis 拦截器,看看这个技术可不可行!

于是我怀着激动颤抖的心开始去 MyBatis 的拦截器,发现可以获取底层mapper的sql,在这个原sql上,加上where条件,再使用反射,替换sql,即可实现不修改mapper中已有的方法,而实现新的查询sql。喔~~~

技术设计

技术设计很重要,占总体时间70%

  1. 打算先套一层 SpringBoot 的 HTTP 拦截器,用于实现管理员和普通用户的鉴权和不同逻辑处理,管理员能看到的数据自然是要多一些的。
  2. 使用 Mybatis 中的 StatementHandler 拦截器, 在获取到 sql 后进行拦截和替换,只需要 加上 where t_id = ?,?由 HTTP 拦截器获取,并放入缓存中
  3. 查看 mapper 中所有的sql,发现有几种类型,单表型、连接型(包含左连接、右连接),最后可以分为以下几种类型:
    1. 包含where
      1. 是否是包含join
    1. 包含 group by
    2. 包含 order by
    3. 包含 limit
    4. 都不包含

于是单独写一个方法,进行原sql进行判断,处理以上几种类型,在返回至拦截器中进行替换。

if (originSql.contains("where")) {
loc = originSql.lastIndexOf("where") + 6;
		// 判断是join还是单表
		if (originSql.contains("join")) {
addSQL = " t.t_id = " + t_id + " and ";
		} else {
addSQL = " t_id = " + t_id + " and ";
		}
		} else if (originSql.contains("group by")) {
loc = originSql.lastIndexOf("group by");
			if (originSql.contains("join")) {
addSQL = " where t.t_id = " + t_id + " ";
		} else {
addSQL = " where t_id = " + t_id + " ";
		}
		} else if (originSql.contains("order by")) {
loc = originSql.lastIndexOf("order by");
			if (originSql.contains(" join ")) {
addSQL = " where t.t_id = " + t_id + " ";
		} else {
addSQL = " where t_id = " + t_id + " ";
		}
		} else if (originSql.contains("limit")) {
loc = originSql.lastIndexOf("limit");
			if (originSql.contains("join")) {
addSQL = " where t.t_id = " + t_id + " ";
		} else {
addSQL = " where t_id = " + t_id + " ";
		}
		} else {
loc = -1;
		if (originSql.contains("join")) {
addSQL = " where t.t_id = " + t_id;
			} else {
addSQL = " where t_id = " + t_id;
			}
}

结果

目前经过测试,目前已经基础实现使用两个类控制新的权限能力,但是后续更为细致的处理,还需要加入更多的逻辑处理方法。

另外附上两个拦截器的作用于用法:

Mybatis 拦截器:拦截器

SpringBoot HTTP 拦截器 : http 拦截器