jd-opensource / jd-opensource/sql-analysis
SQL 替换功能存在重大缺陷,不能解决 MyBatis 动态 SQL
- Lenguaje dominante
- Java
- Estrellas
- 241
- Forks
- 42
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
- 目前代码比较乱,最起码的代码格式化都是乱七八糟
- 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)]
```
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- java, sql
- Área
- backend, databases
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100