jd-opensource / jd-opensource/sql-analysis

SQL 替换功能存在重大缺陷,不能解决 MyBatis 动态 SQL

未关闭
#15 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
Java
星标
241
派生
42
PR 合并指标
30 天内没有已合并 PR

描述

  • 目前代码比较乱,最起码的代码格式化都是乱七八糟
  • ducc 是个什么鬼玩意,知道它是个配置中心,但是全文找不到安装教程
  • SQL 替换功能存在重大缺陷,不能解决 MyBatis 动态 SQL

MyBatis 源码中,根据形参去判断 动态组装的 SQL,被脚本统一成固定 SQL

// 以下代码仅做示例展示
SqlSession sqlSession = MyBatisUtil.getSqlSession();
mapper = sqlSession.getMapper(TaskMapper.class);

System.out.println("1-----" + mapper.queryAll(Task.builder().title("任务1").build()));
System.out.println("2-----" + mapper.queryAll(Task.builder().createUser("zhangsan1").build()));

SqlReplaceConfig.setReplaceSqlBySqlId("com.jd.sql.analysis_samples.mapper.TaskMapper.queryAll"
        , "select * from task where create_user = ?");

System.out.println("3-----" + mapper.queryAll(Task.builder().title("任务2").build()));
System.out.println("4-----" + mapper.queryAll(Task.builder().createUser("zhangsan2").build()));

实际运行结果

Before Replace -> select id, title, content, create_user,create_time, update_time from task WHERE title like ?
com.jd.sql.analysis_samples.mapper.TaskMapper.queryAll -> select id, title, content, create_user,create_time, update_time from task WHERE title like '任务1'
1-----[Task(id=1, title=任务1, content=任务内容1, createUser=zhangsan1, createTime=Thu Oct 12 04:10:43 CST 2023, updateTime=Thu Oct 12 04:10:43 CST 2023)]

Before Replace -> select id, title, content, create_user,create_time, update_time from task WHERE create_user = ?
com.jd.sql.analysis_samples.mapper.TaskMapper.queryAll -> select id, title, content, create_user,create_time, update_time from task WHERE create_user = 'zhangsan1'
2-----[Task(id=1, title=任务1, content=任务内容1, createUser=zhangsan1, createTime=Thu Oct 12 04:10:43 CST 2023, updateTime=Thu Oct 12 04:10:43 CST 2023)]

Before Replace -> select id, title, content, create_user,create_time, update_time from task WHERE title like ?
 INFO [main] - sql analysis - sql replace old:select
         
        id, title, content, create_user,create_time, update_time
     
        from task
         WHERE  title like ?
 INFO [main] - sql analysis - sql replace new:select * from task where create_user = ?
com.jd.sql.analysis_samples.mapper.TaskMapper.queryAll -> select * from task where create_user = '任务2'
3-----[]                   <-----------   ❌ ❌ ❌  这个就异常了


Before Replace -> select id, title, content, create_user,create_time, update_time from task WHERE create_user = ?
 INFO [main] - sql analysis - sql replace old:select
         
        id, title, content, create_user,create_time, update_time
     
        from task
         WHERE  create_user = ?
 INFO [main] - sql analysis - sql replace new:select * from task where create_user = ?
com.jd.sql.analysis_samples.mapper.TaskMapper.queryAll -> select * from task where create_user = 'zhangsan2'
4-----[Task(id=2, title=任务2, content=任务内容2, createUser=zhangsan2, createTime=Fri Oct 13 05:10:43 CST 2023, updateTime=Fri Oct 13 05:10:43 CST 2023)]

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 MyBatis 的动态 SQL 路径和 SqlReplaceConfig.setReplaceSqlBySqlId 入口点开始,使用 mapper.queryAll 作为复现示例。比较替换前后的两个条件查询。完成后,应为每个输入保留正确的动态谓词和绑定值,包括报告中显示的标题大小写。

由索引模型根据 Issue 内容生成。

评估

技术栈
java, sql
领域
backend, databases
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。