3

プロジェクトでデータベースを使用したいのですが、このコードをテストに使用し(jdbc tutorialspointから)、コードとデータベースに変更すると、次のエラーが発生します:

Creating statement...

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM test SET name=eee WHERE id=1' at line 1
Error: unable to connect to SQL!
java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM test SET name=eee WHERE id=1' at line 1
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2975)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1695)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3020)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2949)
    at com.mysql.jdbc.Statement.execute(Statement.java:538)
    at Test.main(Test.java:49)

私のコード:

import java.sql.*;
import java.math.*;


public class Test {
    final static String DB_URL = "jdbc:mysql://localhost/testdb";
    final static String USER = "root";
    final static String PASS = "";

    final static String JDBC_DRIVER="com.mysql.jdbc.Driver";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
            System.out.println("Creating statement...");
            stmt = conn.createStatement();
            String sql = "UPDATE name FROM test SET name=eee WHERE id=1";


            Boolean ret = stmt.execute(sql);
            System.out.println("Return value is : " + ret.toString() );


            int rows = stmt.executeUpdate(sql);
            System.out.println("Rows impacted : " + rows );

            sql = "SELECT id,name FROM test";
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next()){
                int id  = rs.getInt("id");
                String name = rs.getString("name");

                System.out.print("ID: " + id);
                System.out.print(", name: " + name);
            }
            rs.close();
            stmt.close();
            conn.close();
        }
        catch(ClassNotFoundException ex) {
            ex.printStackTrace();
            System.out.println("\n" + ex.getMessage());
            System.out.println("Error: unable to load driver class!");

            System.exit(1);
        }
        catch(IllegalAccessException ex) {
            ex.printStackTrace();
            System.out.println("\n" + ex.getMessage());
            System.out.println("Error: access problem while loading!");
            System.exit(2);
        }
        catch(InstantiationException ex) {
            ex.printStackTrace();
            System.out.println("\n" + ex.getMessage());
            System.out.println("Error: unable to instantiate driver!");
            System.exit(3);
        }
        catch (SQLException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
            System.out.println("\n" + ex.getMessage());
            System.out.println("Error: unable to connect to SQL!");
            System.exit(4);
        }
    }
}

私のデータベースは: 私のDBの写真

このページを見まし たが、役に立ちません!

4

5 に答える 5

3

最初に、あなたのステートメントは有効な更新ステートメントではありません。規則があります:

update <tableName> set <column> = '<newValue>';

これは、最も単純な update ステートメントです。すべての行を更新します。次に、 where句を追加して行を選択できます。これをチェックしてください。

次に、列の値を直接追加していて、値を一重引用符で囲んでいません (ラップする必要があります。そうしないと機能しません)。それを修正するには、次のような一重引用符を追加する必要があります。

set name = 'value';

確かに、これはうまくいきますが、私はこのアプローチが好きではありません。非常に危険で安全ではありません。はるかに安全で ( SQL インジェクションに注意してください)、人間が判読できるパラメータ化されたステートメントを使用することをお勧めします。

PreparedStatement の簡単な使用例:

String sql = "UPDATE test SET name = ? WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, <nameValue>); // binding value for name column
ps.setInt(2, <idValue>); // binding value for where clause
ps.executeUpdate(); // executes statement

PreparedStatements の主な利点をいくつか挙げたいと思います。

  • それらはプリコンパイルされており、SQL ステートメントのデータベース側のキャッシュにより、全体的な実行速度が向上し、同じ SQL ステートメントをバッチで再利用できます。
  • 組み込みの引用符やその他の特殊文字のエスケープによる SQL インジェクション攻撃の自動防止。
  • SQL での非標準 Java オブジェクトの設定を容易にします (Date、Time、Timestamp、BigDecimal、Blob など)。
于 2013-08-10T15:17:44.400 に答える
2

このクエリは正しくありません

String sql = "UPDATE name FROM test SET name=eee WHERE id=1";

に変更します

String sql = "UPDATE test SET name='eee' WHERE id=1";

于 2013-08-10T15:11:43.440 に答える
0

クエリを構築するための別の良いオプションは、「準備されたステートメント」を使用することです - オラクルのチュートリアルを見てください -リンク

あなたの場合のような引用符の問題を回避するのに役立ち、より高いセキュリティを提供します。そして、私が覚えているように、それはクエリをより速く実行するのに役立ついくつかの準備を提供します.

于 2013-08-10T15:17:07.840 に答える
0

String sql = "UPDATE name FROM test SET name=eee WHERE id=1";に変更

 String sql = "UPDATE test SET name='eee' WHERE id=1";
于 2013-08-10T15:10:50.730 に答える
-1

交換:

 String sql = "UPDATE name FROM test SET name=eee WHERE id=1";

の上

 String sql = "UPDATE name FROM test SET name='eee' WHERE id=1";
于 2013-08-10T15:11:53.303 に答える