无法从java向数据库添加新用户

无法从java向数据库添加新用户,java,database,oracle,Java,Database,Oracle,我正在使用以下代码将一个用户添加到我数据库中名为USERS的表中,连接是正确的,因为我尝试了其他查询,它们都成功了,我在Oracle中尝试了这个查询,它成功了,我只是在java中遇到了问题,主要是因为空间和语法,这个查询有什么问题 try { stmt=conn.createStatement(); //query="INSERT INTO Users (user_id,username,password,first_name,last_name) " + " VALUES (s

我正在使用以下代码将一个用户添加到我数据库中名为USERS的表中,连接是正确的,因为我尝试了其他查询,它们都成功了,我在Oracle中尝试了这个查询,它成功了,我只是在java中遇到了问题,主要是因为空间和语法,这个查询有什么问题

try
{
    stmt=conn.createStatement();
    //query="INSERT INTO Users (user_id,username,password,first_name,last_name) " + " VALUES (seq_users.nextval,'"+usernameCreateField.getText()+"','"+new String(passwordCreateField.getPassword())+"','"+firstnameCreateField.getText()+"','"+lastnameCreateField.getText()+"') ";
    query="INSERT INTO Users (user_id,username,password,first_name,last_name) " +" VALUES (seq_users.nextval,'test','test','test','test') ";
    rset=stmt.executeQuery(query);
}
catch(SQLException | NumberFormatException e)
{
    System.out.println("result error, " +e.getMessage());
}
finally
{
    try
    {
        rset.close();
        stmt.close();
    }
    catch(Exception e)
    {
        System.out.println("Error in closing "+e.getMessage());
    }
}

你要做的是DML操作。试着替换

rset=stmt.executeQuery(query);


你要做的是DML操作。试着替换

rset=stmt.executeQuery(query);


所以问题是您在语句上调用了
executeQuery(query)
,这就是它不起作用的原因
executeQuery()
方法不能用于DML(数据操作语言)语句,如
INSERT
UPDATE
DELETE
。对于这些语句,
Java
提供了名为
executeUpdate()
的方法,该方法适用于这些DML语句

从文档中:

executeUpdate方法执行此 PreparedStatement对象,它必须是SQL数据操作 语言(DML)语句,如插入、更新或删除;还是SQL 不返回任何内容的语句,例如DDL语句

所以,只要用这个方法替换实际的方法,它就会工作

对不起,我很好奇,但是为什么不使用参数化的
SQL
语句呢?您应该知道,如果不使用参数化语句,SQL注入的危险性很高,许多黑客使用它来破坏数据库。你应该考虑一下。这是非常重要的,如果你想你的数据库将更安全。你不会相信什么能证明数据库的SQL注入

仅举个例子,您应该创建如下查询:

query = "INSERT INTO Users (user_id,username,password,first_name,last_name) values(?,?,?,?,?) ";
PreparedStatement ps = conn.prepareStatement(query);
// no set parameters
ps.setInt(1, someDTO.getId());
ps.setString(2, someDTO.getUserName());
ps.setString(3, someDTO.getPassword());
ps.setString(4, someDTO.getFirstName());
ps.setString(5, someDTO.getLastName());
ps.executeUpdate();
System.out.println("Data was inserted successfully.");
return true;
字符表示一个参数。编号以1、2、3等开头。。不是从零开始的

然后,在执行以下语句之前,必须用实际数据替换这些参数:

query = "INSERT INTO Users (user_id,username,password,first_name,last_name) values(?,?,?,?,?) ";
PreparedStatement ps = conn.prepareStatement(query);
// no set parameters
ps.setInt(1, someDTO.getId());
ps.setString(2, someDTO.getUserName());
ps.setString(3, someDTO.getPassword());
ps.setString(4, someDTO.getFirstName());
ps.setString(5, someDTO.getLastName());
ps.executeUpdate();
System.out.println("Data was inserted successfully.");
return true;
更多关于SQL注入的信息:和

编辑:

我忘了告诉你,当我只是在看你的代码时,当你打开
连接
然后当然要关闭它时,你不必为
语句
结果集
调用
close()
方法,当你关闭
连接
后,所有这些都将被关闭

希望这对你有帮助


关于

,所以问题是您对语句调用了executeQuery(查询),这就是它不起作用的原因
executeQuery()
方法不能用于DML(数据操作语言)语句,如
INSERT
UPDATE
DELETE
。对于这些语句,
Java
提供了名为
executeUpdate()
的方法,该方法适用于这些DML语句

从文档中:

executeUpdate方法执行此 PreparedStatement对象,它必须是SQL数据操作 语言(DML)语句,如插入、更新或删除;还是SQL 不返回任何内容的语句,例如DDL语句

所以,只要用这个方法替换实际的方法,它就会工作

对不起,我很好奇,但是为什么不使用参数化的
SQL
语句呢?您应该知道,如果不使用参数化语句,SQL注入的危险性很高,许多黑客使用它来破坏数据库。你应该考虑一下。这是非常重要的,如果你想你的数据库将更安全。你不会相信什么能证明数据库的SQL注入

仅举个例子,您应该创建如下查询:

query = "INSERT INTO Users (user_id,username,password,first_name,last_name) values(?,?,?,?,?) ";
PreparedStatement ps = conn.prepareStatement(query);
// no set parameters
ps.setInt(1, someDTO.getId());
ps.setString(2, someDTO.getUserName());
ps.setString(3, someDTO.getPassword());
ps.setString(4, someDTO.getFirstName());
ps.setString(5, someDTO.getLastName());
ps.executeUpdate();
System.out.println("Data was inserted successfully.");
return true;
字符表示一个参数。编号以1、2、3等开头。。不是从零开始的

然后,在执行以下语句之前,必须用实际数据替换这些参数:

query = "INSERT INTO Users (user_id,username,password,first_name,last_name) values(?,?,?,?,?) ";
PreparedStatement ps = conn.prepareStatement(query);
// no set parameters
ps.setInt(1, someDTO.getId());
ps.setString(2, someDTO.getUserName());
ps.setString(3, someDTO.getPassword());
ps.setString(4, someDTO.getFirstName());
ps.setString(5, someDTO.getLastName());
ps.executeUpdate();
System.out.println("Data was inserted successfully.");
return true;
更多关于SQL注入的信息:和

编辑:

我忘了告诉你,当我只是在看你的代码时,当你打开
连接
然后当然要关闭它时,你不必为
语句
结果集
调用
close()
方法,当你关闭
连接
后,所有这些都将被关闭

希望这对你有帮助

问候

试试这个

try {    
String URL = "jdbc:sqlserver://127.0.0.1:1433;databaseName=(databaseNameHere)";    

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn2 = DriverManager.getConnection(URL,"username","userpassword");

String sql = "INSERT INTO tableNameHere(user_id,username,password,first_name,last_name) values(?,?,?,?,?)";

ps = conn2.prepareStatement(sql);
ps.setString(1, user_id);
ps.setString(2, username);
ps.setString(3, password);
ps.setString(4, first_name);
ps.setString(5, last_name);  

}
试试这个

try {    
String URL = "jdbc:sqlserver://127.0.0.1:1433;databaseName=(databaseNameHere)";    

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn2 = DriverManager.getConnection(URL,"username","userpassword");

String sql = "INSERT INTO tableNameHere(user_id,username,password,first_name,last_name) values(?,?,?,?,?)";

ps = conn2.prepareStatement(sql);
ps.setString(1, user_id);
ps.setString(2, username);
ps.setString(3, password);
ps.setString(4, first_name);
ps.setString(5, last_name);  

}

发布错误stacktrace,让其他人了解错误的位置和可能的原因。我建议使用
PreparedStatement
而不是
Statement
。所以您运行了它,它没有打印任何错误并通过了,但数据库中没有插入任何内容?您能否尝试删除try-catch以查看try-catch是否占用了某些内容?执行代码时会发生什么情况?有抛出异常吗?异常的消息是什么?您是否尝试打印
查询
字符串并查看其语法是否正确?请阅读有关准备语句的信息。您的注释代码是遭受转义问题或SQL注入攻击的最佳方式。发布错误stacktrace,让其他人了解错误的位置和可能的原因。我建议使用
PreparedStatement
而不是
Statement
。所以您运行了它,它没有打印任何错误并通过了,但数据库中没有插入任何内容?您能否尝试删除try-catch以查看try-catch是否占用了某些内容?执行代码时会发生什么情况?有抛出异常吗?异常的消息是什么?您是否尝试打印
查询
字符串并查看其语法是否正确?请阅读有关准备语句的信息。您的注释代码是遭受转义问题或SQL注入攻击的最佳方式。当您关闭连接时,语句、结果集将自动关闭。如果您将“rset=stmt.executeQuery(query);”替换为“int affectedRows”=