Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC程序从一个表中选择数据并插入到不同数据库中的另一个表中_Java_Postgresql_Jdbc - Fatal编程技术网

Java JDBC程序从一个表中选择数据并插入到不同数据库中的另一个表中

Java JDBC程序从一个表中选择数据并插入到不同数据库中的另一个表中,java,postgresql,jdbc,Java,Postgresql,Jdbc,我是java新手,我正在尝试将一个数据从旧的数据库插入到新的数据库。 我试过一个程序来做这件事,它显示了一个错误,比如“语法错误”,找不到错误所在 程序必须连接到2个postgres db,并在表中选择数据并将其插入数据库 另一个数据库表。两个表具有相同的字段和数据类型 import java.sql.* ; public class con2 { public static void main( String[] args ) { try { Connection co

我是java新手,我正在尝试将一个数据从旧的数据库插入到新的数据库。 我试过一个程序来做这件事,它显示了一个错误,比如“语法错误”,找不到错误所在

程序必须连接到2个postgres db,并在表中选择数据并将其插入数据库 另一个数据库表。两个表具有相同的字段和数据类型

import java.sql.* ;   
public class con2 
{ 
public static void main( String[] args ) 
{ 
try 
{ 
   Connection con = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/old_db","postgres","password");
try
{
   Connection con1 = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/new_db","postgres","password");

 Statement st = con.createStatement();
 Statement st1 = con1.createStatement();   
ResultSet rs = st.executeQuery("SELECT * FROM users"); 



  int val = st1.executeUpdate("insert into users("+"'rs()'"+")");

        rs.close();
                        st.close(); 
                    st1.close(); 



}
catch(SQLException e) 
  { 
         System.out.println( "could not get JDBC connection for new_db: " + e ); 
  } 
}
catch(SQLException e) 
  { 
         System.out.println( "could not get JDBC connection for  old_db: " + e ); 
  } 
} 
} 
我使用的是jdbc4,这是非常错误的:

  int val = st1.executeUpdate("insert into users("+"'rs()'"+")");
您必须迭代
结果集
插入
每一行

我建议使用
PreparedStatement
绑定变量和批处理
INSERT

我还建议您做很多其他的更改,但从这开始,让代码正常工作

以这种方式嵌套两个try/catch块是个坏主意。一个就行了

在finally块中关闭资源

这只是一个示例,但为什么您必须选择数据并将其带到中间层呢

为什么要重新插入已经存在的数据


提出的这个问题毫无意义。投票结束。

我已经编写了一个如下所示的程序,它正在运行

谢谢你的建议

import java.sql.*;
import java.io.*;
import java.util.*;

public class test1 {

    public static void main(String[] argv) throws Exception {
        try {
            Connection con = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/old","user","pass");
            Connection con1 = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/new","user","pass");

            String sql = "INSERT INTO users("+ "name,"+ "active,"+ "login,"+ "password)"+ "VALUES(?,?,?,?)";

            Statement statement = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

            PreparedStatement pstmt = con1.prepareStatement(sql);

            ResultSet rs = statement.executeQuery("SELECT * FROM users");
            while (rs.next()) {
                String nm = rs.getString(2);
                Boolean ac = rs.getBoolean(3);
                String log = rs.getString(4);
                String pass = rs.getString(5);

                pstmt.setString(1, nm);
                pstmt.setBoolean(2, ac);
                pstmt.setString(3, log);
                pstmt.setString(4, pass);

                pstmt.executeUpdate();
            }
        } catch (SQLException e) {
            System.out.println("could not get JDBC connection: " +e);
        } finally {
            con.close();
            con1.close();
        }
    }

}

另一种方法是在PostgreSQL中使用。

您的程序无法转义数据,并且极易受到SQL注入攻击。见和-1因为如果您要求他人帮助您,则始终会显示错误消息的确切文本。由于没有传递任何数据,因此可能没有那么容易受到攻击。但对于一个真正的程序来说,这是一个有效点。@duffymo当然,数据是从另一个数据库传入的。一个写得正确但不太偏执的程序很可能插入了
”--删除公共模式--。XSS风格的攻击完全可以通过SQL注入实现;克雷格·林格(Craig Ringer)很好地理解了你的观点。嗨,达菲莫,在JDBC中,不把数据带到中间层就可以跨数据库移动数据吗?如果你想在数据库之间移动数据,我建议使用ETL工具,不要使用Java。“在JDBC中”对我来说意味着“中间层”,所以我的回答是“不,这是不可能的。”