将参数从一个 PreparedStatement 复制到另一个

Posted

技术标签:

【中文标题】将参数从一个 PreparedStatement 复制到另一个【英文标题】:copying parameters from one PreparedStatement to another 【发布时间】:2013-03-21 11:44:46 【问题描述】:

我像这样创建一个新的 PreparedStatement:

PreparedStatement newPs = origPrepStatement.getConnection().prepareStatement("EXPLAIN " + sql);

origPrepStatement 也是 PreparedStatement,它包含参数。 我想将 origPrepStatement 的参数复制到 newPs。 有没有办法做到这一点?

【问题讨论】:

查看这里:***.com/a/4691561/2168879 很伤心:-(我不需要它来调试,我需要它用于其他目的。 【参考方案1】:

似乎没有简单的解决方案;在下面找到我笨拙的解决方案

class PreparedStatementParameters implements InvocationHandler 
    Map<Integer, Object> map = new HashMap<>();
    PreparedStatement ps;

    PreparedStatementParameters(PreparedStatement ps) 
        this.ps = ps;
    

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
        if (method.getName().startsWith("set")) 

        
        return method.invoke(proxy, args);
    

    public void copyParameters(PreparedStatement ps) throws SQLException 
        for (Map.Entry<Integer, Object> e : map.entrySet()) 
            ps.setObject(e.getKey(), e.getValue());
        
    


public class T2 
    public static void main(String[] args) throws Exception 
        PreparedStatement ps1 = ...
    PreparedStatementParameters ps1params = new PreparedStatementParameters(ps1);
        PreparedStatement ps1Proxy = (PreparedStatement) Proxy.newProxyInstance(null,
                new Class[]  PreparedStatement.class , new PreparedStatementParameters(ps1));
        ps1Proxy.setString(1, "test");
        ...
        PreparedStatement ps2 = ...
        ps1params.copyParameters(ps2);
    

【讨论】:

这里发生了什么? if (method.getName().startsWith("set")) 你在ps1上设置的所有参数都会保存在PreparedStatementParameters中

以上是关于将参数从一个 PreparedStatement 复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

将列名作为 PreparedStatement 的输入参数

Java PreparedStatement将IN参数设置为int数组[重复]

PreparedStatement 、 CallableStatement 和性能注意事项

将参数传递给 JDBC PreparedStatement

PreparedStatement 参数索引超出范围

java中PreparedStatement执行带参数的sql语句如何实现模糊查询?