2016-11-08 9 views
0

私はGroovy (2.4.7)を初めて利用しています。これは私がやろうとしていることです。基本的には、ExcelからSQL Serverにデータをロードすることが目的です。 2つのリストがあり、1つはキーであり、もう1つは値です。バッチSQL文を実行するためにこれらの2つのリストをどのように呼び出すのですか?ここで Groovy - マップまたはリストを使用したバッチクエリ

は、私がこれまで持っているものです。

def k = [Field1,Field2,Field3,Field4,Field5] 

def Value1 = 1 
def Value2 = 2 
def Value3 = 3 
def Value4 = 4 
def Value5 = 5 

def v = [Value1,Value2,Value3,Value4,Value5] 

def query = """\ 
INSERT INTO TableA 
    ($k) 
VALUES 
    ($v) 
""" 

sql.withTransaction { 
    sql.withBatch(20) {stmt -> 
     stmt.addBatch(query) 
    } 
} 
  1. をこのようにすることで、大きな文字列としてリスト全体を扱いますGroovyのように思えます。私は文字列としてリストを出力し、一重引用符を削除することができますが、それはクールなようではありません。リスト内のフィールドをパラメータ化できますか?それは私にエラーを与えたので、k個のリストについては、私は以下のようなすべてのフィールドに単一引用符を持っている必要があります

  2. def k = ['Field1','Field2','Field3','Field4','Field5']

    私は、フィールド名が文字列が、以下の方法でなければなりません知っています一度に1つのSQLクエリを実行しました。私はリストを変更するように感じるが、クエリを台無しにするよりも優れています。しかし、私がこのようにしてはならないなら、私を止めてください。

    def query = """\ 
        INSERT INTO TableA 
         (Field1,Field2,Field3,Field4,Field5) 
        VALUES 
         (${Value1},${Value2},${Value3},${Value4},${Value5}) 
    """ 
    sql.execute(query) 
    
  3. これらの2つのリストをマップに追加することもできます(下記参照)。これはバッチクエリを実行するより良い方法でしょうか?私はこのプロジェクトで地図をどのように利用するのか分かりません。もちろん

    def m = [k, v].transpose().collectEntries {it}

、私が思いついた方法は理想的ではないかもしれないと私はまた、任意のSQLインジェクションを防ぐにしたいです。私はあなたが私にサンプルコードを提供することができれば、ベストプラクティスを公開しています。再び、あなたの時間と助けに感謝します。

答えて

0

わかりました。これはわかりましたが、それはうまくいきました。これは動的なフィールドでも機能します。私がこれまでに学んだことから、これはSQLインジェクションのおかげで良い答えにはならないかもしれませんが、これはauthroized personと内部的にしか使用していません。しかし、この方法を改善するために誰の意見にも歓迎します。

def sheet1 // Need to read in your Excel sheet 
def sql = Sql.newInstance(// Your SQL connection config) 

def tableName = "TableA" 

def k = ['Field1','Field2','Field3','Field4','Field5'] 

// Code below is from http://stackoverflow.com/questions/20150880/insert-a-hashmap-into-any-database-table/20151521#20151521     
StringBuilder query = new StringBuilder("INSERT INTO ").append(tableName).append(" (") 
StringBuilder placeholders = new StringBuilder() 

for (Iterator<String> iter = k.iterator(); iter.hasNext();) { 
    query.append(iter.next()) 
    placeholders.append("?") 

    if (iter.hasNext()) { 
     query.append(",") 
     placeholders.append(",") 
    } 
} 

query.append(") VALUES (").append(placeholders).append(")") 

sql.withTransaction { 

    sql.withBatch(20, query.toString()) {ps -> 
     sheet1.each {data -> 

      def Value1 = 1 
      def Value2 = 2 
      def Value3 = 3 
      def Value4 = 4 
      def Value5 = 5 

      def v = [Value1,Value2,Value3,Value4,Value5] 

      ps.addBatch(v) 
     } 
    } 
} 

sql.close() 
関連する問題