2017-11-06 4 views
0

からIDを渡すと、コードです:JavaのJDBCは、 - ここで、テーブル

public static Connection getConnection() throws Exception { 

    String name1 = "Danny"; 
    String city1 = "Wien"; 

    try { 
     String driver = "com.mysql.jdbc.Driver"; 
     String url = "jdbc:mysql://localhost:3306/supermarket??verifyServerCertificate=false&useSSL=true"; 
     String username = "myuser"; 
     String password = "mypass"; 
     Class.forName(driver); 

     Connection conn = DriverManager.getConnection(url, username, password); 

     String sql = "insert into marketinfo " 
       + " (name, country)" + " values (" + name1 + ", " + city1 + ")"; 

     Statement insertie = conn.prepareStatement(sql); 

     insertie.executeUpdate(sql); 

    } catch (Exception e) { 
     System.out.println(e); 
    } 

    return null; 
} 

私の誤差が"Unknown column 'Danny' in 'field list'"です。

Sqlデータベースでは、myテーブルにID、名前、都市が含まれています。そのidは自動的に増分されるので、idフィールドを渡したいと思います。

答えて

0

これは間違った方法です。 PreparedStatementについて、また値をパラメータにバインドする方法について学ぶ必要があります。

しかし、それよりも悪いです。

あなたのメソッドはgetConnectionですが、クエリも実行しています。メソッドは1つのことをうまくやるべきです。

あなたはあなたのリソースを一切閉じません。もう一つの悪い考え。

コンソールにスタックトレースを出力します。それを記録する方が良い。

あなたのハードワイヤーの代わりにそれらを渡すの接続パラメータ。

ここプーリングは接続はありません。

0

はあなたがパラメータ化クエリの代わりに、文字列の連結を使用する必要があるのvar NAME1とCITY1

String sql = "insert into marketinfo " 
     + " (name, country)" + " values ('"+ name1 +"', '"+ city1 +"')"; 

しかし、最も重要なの周りの内側の引用符を逃したようです。あなたはSQLであなたの変数を引用する必要があり、この修正するには

0

String sql = "insert into marketinfo " 
      + " (name, country)" + " values ('"+ name1 +"', '"+ city1 +"')"; 

をしかし、これはひどいコードであり、そして、あなたはこのようにそれを行うべきではありません。

が理由ではないため、ここを参照してください:ヒットとしてhttps://www.acunetix.com/websitesecurity/sql-injection/

を、あなたのSQLは次のようになります。

String sql = "insert into marketinfo " 
       + " (name, country)" + " values (:name, :city)"; 

その後、あなたは値を設定するために準備されたステートメントを使用します。このようなコードは、ウェブサイトがすべての個人情報を盗まれる理由です。

0

文字列またはvarchar型が2重引用符'some string'の間でなければなりませんが、これはまだそれが使用することをお勧めします(あなたが今持っているように)構文エラーを回避するように確保するか、SQLインジェクションないPreparedStatement

String sql = "insert into marketinfo (name, country) values (?, ?)"; 

try(PreparedStatement insertie = con.prepareStatement(sql);){ 
    insertie.setString(1, name1); 
    insertie.setString(2, city1); 
    insertie.executeUpdate(); 
    //... 
} 
1

たくさんありだろうそのコードで、他の人があなたがそれを解読すべきだと示唆しているように。しかし、実際にクエリは次のように行うことができます実行:

public class YourClass { 
    private static final String SQL = "INSERT INTO marketinfo (name, country) VALUES (?,?)"; 

    public void addMarketInfo(String name, String city) { 
     try (Connection conn = getConnection(); 
      PreparedStatement stmt = conn.prepareStatement(SQL)) { 

      stmt.setString(1, name); 
      stmt.setString(2, city); 
      stmt.executeUpdate(); 

     } catch (SQLException e) { 
      // This is fine for debugging, but you probably want to log this or throw an exception 
      // Depends on how the rest of your application is set up 
      e.printStackTrace(); 
     } 
    } 
} 

は、すべての接続を作成するコードが最も可能性が高い私の例のようにのgetConnection()メソッドによって、別のクラスに移動した後、呼び出される必要があります。

JDBCを使用している場合は、PreparedStatementが使用されています。どのように使用されているかの例をもっと見る価値があります。他の利点の中でも、元の質問のような文字列連結バグを避けるのに本当に役立ちます。

+0

あなたはメソッドスコープのConnectionまたはPreparedStatementを閉じているわけではありません。悪い考えです。これはJDK 8の試用には適しているかもしれません。https://stackoverflow.com/questions/8066501/how-should-i-use-try-with-resources-with-jdbc – duffymo

+0

どうすれば閉じられますか?彼らはtry-with-resourcesブロックに入っています。もちろん、私は 'stmt.set()'呼び出しを、あなたがリンクした答えのような別のメソッドに入れていません。しかし、私はResultSetオブジェクトを扱っていないので、必要ではないようです。私が見逃した別の面がありますか? – gridDragon

+1

そこにはConnectionがあります。私はそれがPreparedStatementに発生していることを知らない。私の失敗かもしれない、あなたのものではありません。だから私はdownvoteしなかった。 – duffymo

関連する問題