【问题标题】:MySQL Java Spring batchUpdate column name escapingMySQL Java Spring batchUpdate列名转义
【发布时间】:2015-12-28 22:42:35
【问题描述】:

我有一个使用 Spring 的 mysql batchUpdate,名为 JDBC,如下所示:

public SqlParameterSource[] getBatchParamsArray(Collection params) {
    List<SqlParameterSource> dbParams = new ArrayList<>();
    for(Object p: params) {
       BeanPropertySqlParameterSource beanPropertySqlParameterSource = new      BeanPropertySqlParameterSource(p);
       dbParams.add(beanPropertySqlParameterSource);
     }
     return dbParams.toArray(new SqlParameterSource[0]);
}

这个用法如下:

String SQL = "INSERT INTO mytable (user_id, related_user_id,:tagName) VALUES (:userId,:relatedUserId,:taggedAt) ON DUPLICATE KEY UPDATE set :tagName=:taggedAt"
this.namedJDBC.batchUpdate(SQL, this.getBatchParamsArray(listOfPOJOs));

我的问题是 batchUpdate 转义了列名,导致查询如下:

INSERT INTO mytable (tuser_id, related_user_id,'some_tag') VALUES (1234,24542336,'2015-12-17 10:44:25') ON DUPLICATE KEY UPDATE 'some_tag'='2015-12-17 10:44:25'

some_tag 列存在,但是转义 ' 使 SQL 查询失败,那么如何防止转义并手动执行,或者以其他方式实现批量插入所需的通用功能

【问题讨论】:

  • String SQL = "INSERT INTO mytable (user_id, related_user_id,"+tagName+") 值 (:userId,:relatedUserId,:taggedAt) ON DUPLICATE KEY UPDATE set "+tagName+"=:taggedAt"
  • "+tagName+" 不会被实际标签 "some_tag" 替换

标签: java mysql spring spring-jdbc


【解决方案1】:

到目前为止,似乎不可能,我也尝试过:

SET @tagName='some_tag'; INSERT INTO myTable (user_id, related_user_id,@tagName) .... 

还是同样的问题。 所以我得到了这样的结果:

this.getConnection().setAutoCommit(false);
for(POJO t:listOfPOJOs) {
   this.namedJDBC.update(SQL.replace(":tagName",t.getTagName()), new BeanPropertySqlParameterSource(t));
}
this.getConnection().setAutoCommit(true);

在此感谢您的反馈!

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多