如何使用需要 2 个参数且其中只有一个参数存储在列表中的查询进行批处理更新

Posted

技术标签:

【中文标题】如何使用需要 2 个参数且其中只有一个参数存储在列表中的查询进行批处理更新【英文标题】:how can I batchUpdate with a query that requires 2 parameters and only one of them is stored in a list 【发布时间】:2011-09-18 03:17:42 【问题描述】:

我使用 Spring-JDBC 在我的 mysql 数据库中插入用户的 facebook 好友列表。

我有一个包含用户 uid 的最终 Long 和一个包含他的朋友列表的 List。

我的查询是:

final String sqlInsert="insert into fb_user_friends(fb_uid,friend_uid) values(?,?)";

我使用 SqlParameterSourceUtils 创建批处理参数

SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(friendsList.toArray());

我使用以下命令执行插入:

int[] insertCounts = this._jdbcTemplate.batchUpdate(sqlInsert,batch);

这里的问题是列表只包含查询所需的第二个参数。

我是否必须修改friendsList以添加另一列或有其他方法?

谢谢!

【问题讨论】:

【参考方案1】:

这应该会有所帮助:http://static.springsource.org/spring/docs/3.0.x/reference/jdbc.html#jdbc-advanced-jdbc


编辑:

final Long uid = 1L;
final List<Long> friendList /* = ... */;

int[] updateCounts = jdbcTemplate.batchUpdate(
    "insert into fb_user_friends(fb_uid,friend_uid) values(?,?)",
    new BatchPreparedStatementSetter() 
        public void setValues(final PreparedStatement ps, final int i) throws SQLException 
            ps.setLong(1, uid);
            ps.setLong(2, friendList.get(i));
        

        public int getBatchSize() 
            return friendList.size();
        
);

final List<User> userList /* = ... */;
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(userList.toArray());
int[] updateCounts = simpleJdbcTemplate.batchUpdate(
    "insert into fb_user_friends(fb_uid,friend_uid) values(:uid,:friendUid)",
    batch);

@Data // from lombok 
class User 
    private Long uid;
    private Long friendUid;

未经测试,改编自提供的链接示例

【讨论】:

嗨。我已经熟悉 Spring JDBC 文档。在那里没有找到相关信息后,我来这里询问。也许无法完成,但我只是想确定一下。

以上是关于如何使用需要 2 个参数且其中只有一个参数存储在列表中的查询进行批处理更新的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 如何执行 带参数的 存储过程

存储过程中参数是动态的,需要判断是不是为空

SQL存储过程如何调用存储过程?

SQL Server 存储过程参数 - 不同类型

SQL SERVER 存储过程中如何使用传入的DB参数,实现跨库查询?

从FORM传递参数到存储过程