2016-11-08 34 views
0

我是0123'的新手,這正是我想要做的。基本上,目標是將數據從Excel加載到SQL Server中。有兩個清單,一個是關鍵,另一個是價值。如何調用這兩個列表來運行批處理SQL語句?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中將把整個列表作爲一個大的字符串。我可以輸出列表作爲字符串,並刪除單引號,但似乎並不酷。我們可以參數化列表中的字段嗎?

  2. 用於K名單,我需要有像下面的所有字段單引號,因爲它給我的錯誤:

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

    我知道字段名稱應弦,但通過以下方式一次運行一個SQL查詢。我覺得要修改列表比糾結查詢要好。但如果我不這樣做,請阻止我。

    def query = """\ 
        INSERT INTO TableA 
         (Field1,Field2,Field3,Field4,Field5) 
        VALUES 
         (${Value1},${Value2},${Value3},${Value4},${Value5}) 
    """ 
    sql.execute(query) 
    
  3. 我甚至可以將這兩個列表添加到地圖中(見下文)。這是否會成爲運行批量查詢的更好方式?我只是不知道如何在這個項目中使用地圖。

    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()