0

MySQL テーブルの列に値のリストを挿入する方法を教えてください。

これが私のプロジェクトです:

public void settingAmount(List<String>lst)throws Exception{

    // Accessing driver from jar files 
    Class.forName("com.mysql.jdbc.Driver");
     // here we create a variable for the connection called con 
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ozon","root","root");
     // here we create our query 
    Statement stmt = (Statement) con.createStatement();
    //performing insert operation :)
    lst.toArray(ss);

    for(String ins:ss){
        double d=Double.parseDouble(ins);
        String insert = "INSERT INTO storage_other(total) VALUES ("+ins+");";
        //String insert = "INSERT INTO storage_other(amount) VALUES ("+ls+");";
        // Here we are going to Execute the query
        stmt.executeUpdate(insert);
        System.out.print("Done Seccesfully :)");
    }
}
4

3 に答える 3

8

あなたがしたいことは、使用することですbatches。バッチを使用すると、同時に実行するステートメントのリストを送信できます。

ここに例があります

connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement("INSERT INTO storage_other(total) VALUES (?)");
for (String ins:ss){
    ps.setObject(1, d);
    ps.addBatch();
}
ps.executeBatch();
connection.commit();

これは、インデックスを持つテーブルでの個々の挿入よりも大幅に高速になります。

于 2013-05-27T15:06:39.943 に答える
2

これは、Oracle SQL データベースにデータを挿入するために使用した方法です。

     private boolean submit(Connection con, String query){
             try {
                 PreparedStatement preStatement;
                 preStatement = con.prepareStatement(query);
                 preStatement.executeQuery();
                 preStatement.close();
                 return true;
             }catch (Exception e) {
                 System.out.println("Exception cought, updating log.");
                 return false;
             }
         }

insertステートメントを準備し、この関数を呼び出してアクションを実行できます。接続オブジェクトとクエリを使用して呼び出します。何か問題が発生した場合はtrue、完了時に返されます。falseエラーをログに記録する場合e.getMessage()は、例外ブロックでエラー メッセージを文字列として取得するために使用します。

コメントで述べたように、PreparedStatementオブジェクトを使用して SQL インジェクション攻撃を回避'し、データに含まれている可能性のあるものをトリミングしてみてください。

于 2013-05-27T15:12:21.500 に答える
1

そんなあなたにおすすめしたい方法がこちらです。いくつかの考え:

  1. オブジェクトに接続を与えます。そのメソッドは、INSERT という 1 つのことを行う必要があります。
  2. トランザクションである必要があります。
  3. 完了したら、リソースをクリーンアップする必要があります。
  4. それが金額である場合は、ダブルのリストを提供するようにユーザーに伝えます。解析しないでください。クライアントにそれをさせてください。

完全なコードは次のとおりです。

public class Inserter {

    private static final String INSERT_SQL = "INSERT INTO storage_other(total) VALUES(?))";

    private Connection connection;

    public Inserter(Connection connection) {
        this.connection = connection;
    }

    public int settingAmount(List<Double> amounts)throws SQLException {
        int numAmountsInserted = 0;
        PreparedStatement ps = null;
        this.connection.setAutoCommit(false);
        try {
            ps = this.connection.prepareStatement(INSERT_SQL);
            for(Double amount : amounts) {
                ps.setDouble(1, amount);
                numAmountsInserted += ps.executeUpdate();
            }
            this.connection.commit();
        } catch (SQLException e) {
            DatabaseUtils.rollback(this.connection);
            throw e;
        } finally {
            DatabaseUtils.close(ps);
            this.connection.setAutoCommit(true);
        }
        return numAmountsInserted;
    }
}
于 2013-05-27T15:16:15.350 に答える