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

:::info 大家好,我是橘子皮。 :::

需求场景

最近领到一个新需求,是一个项目的子系统,需要实习从父项目跳转过来后,在子项目中实现不同用户的做题逻辑。具体的内容不便多说~
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
    2. 包含 group by
    3. 包含 order by
    4. 包含 limit
    5. 都不包含

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

java
复制代码
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 拦截器](https://www.yuque.com/shizi-6yunv/mhm17b/wruof8hkebeay6i9?singleDoc# 《SpringBoot HTTP 拦截器》)

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP