jd-opensource / jd-opensource/sql-analysis

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

Đang mở
#15 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
241
Fork
42
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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

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

```Java
// 以下代码仅做示例展示
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()));
```

实际运行结果

```Java
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)]
```

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Start with the MyBatis dynamic SQL path and the SqlReplaceConfig.setReplaceSqlBySqlId entry point, using mapper.queryAll as the reproducing example. Compare the two conditional queries before and after replacement. Done should preserve the correct dynamic predicate and bound value for each input, including the title case shown in the report.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
java, sql
Lĩnh vực
backend, databases
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.