调试 Dynamic SQL(动态 SQL) 的错误,核心思路是:先看到最终生成的 SQL,再像普通 SQL 一样排查。下面按常见场景给你一套实用方法。
永远先打印 / 输出最终执行的 SQL
动态 SQL 出错,90% 是因为拼接出的 SQL 不对,而不是执行逻辑错。
# application.yml
logging:
level:
com.xxx.mapper: debug
或
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
Preparing: 和 Parameters:如果你用的是 <script> + @SelectProvider:
String sql = new SQL()
.SELECT("*")
.FROM("user")
.WHERE("id = #{id}")
.toString();
System.out.println(sql);
String sql = "SELECT * FROM user WHERE 1=1 ";
if (name != null) sql += " AND name = ?";
System.out.println(sql);
String debugSql = sql.replace("?", "'" + name + "'");
sql = f"SELECT * FROM user WHERE name = '{name}'"
print(sql)
⚠️ 注意 SQL 注入风险,仅调试用
SET @sql = CONCAT('SELECT * FROM ', table_name);
SELECT @sql; -- 先打印
PREPARE stmt FROM @sql;
✅ 语法错误
AND 前没有 WHERE✅ 参数错误
✅ 逻辑错误
把动态 SQL 写死成一条 SQL,确认能跑通,再改成动态。
if (cond1) sql += " AND a = 1";
if (cond2) sql += " AND b = 2";
逐个打印 sql
把最终 SQL 复制到:
看具体报错信息(比代码堆栈更清楚)
Dynamic SQL 调试 = 打印最终 SQL + 用数据库客户端验证
如果你愿意,可以:
我可以直接帮你定位问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。