Groovy SQL动态插入数据无报错但未生效问题求助
问题根因
你遇到的核心问题是预编译SQL的参数列表写法错误:connection.execute Mytable, [${SYS_idValue}]
这里的${}是Groovy GString专属的插值语法,仅在双引号/三双引号包裹的字符串场景下生效,直接写在List字面量中属于非法用法,实际传入参数不是你预期的'9999999',但因为SQL本身语法合法,所以不会抛出异常,最终导致没有数据写入。
另外还有一个潜在问题:JDBC连接可能默认关闭了自动提交,插入操作执行后未手动提交事务,直接关闭连接会导致插入被回滚。
修正代码
def SYS_idValue = '9999999' def connection = null try { // 建立数据库连接 connection = Sql.newInstance(CCMJdbcUrl, CCMUsername, CCMPassword, CCMJdbcDriver) // 开启自动提交,或执行完插入后手动调用 connection.commit() connection.connection.autoCommit = true def insertSql = 'INSERT INTO INTELTABLE (SYS_ID) VALUES (?)' // 参数列表直接传入变量,不需要${}包裹 connection.execute insertSql, [SYS_idValue] } catch (Exception e) { println("Exception" + e) // 异常时回滚事务 if (connection) { connection.rollback() } } finally { // 资源关闭统一放finally块,避免异常场景下连接泄漏 if (connection) { connection.close() } }
可选写法
Groovy SQL原生支持GString插值自动转预编译参数,你也可以用更简洁的写法,效果和占位符写法完全一致,还能避免SQL注入风险:
def SYS_idValue = '9999999' def connection = null try { connection = Sql.newInstance(CCMJdbcUrl, CCMUsername, CCMPassword, CCMJdbcDriver) connection.connection.autoCommit = true // 直接用GString插值,Groovy SQL会自动处理为预编译语句 connection.execute "INSERT INTO INTELTABLE (SYS_ID) VALUES (${SYS_idValue})" } catch (Exception e) { println("Exception" + e) if (connection) connection.rollback() } finally { if (connection) connection.close() }
内容的提问来源于stack exchange,提问作者Fabio Ochoa Restrepo
相关产品推荐
相关产品推荐

