参考文章:
Using bulk copy with the JDBC driver
SqlServer数据批量写入
SqlServer批量插入数据方法–SqlBulkCopy
sqlserver buld copy需要提供,数据文件的对应表的元数据信息主要的字段的位置、字段的名称、字段的数据类型。
执行bulk load时候不一定要在sqlserver所在机器执行,即使sqlserver服务在docker里也能执行。
SQLServerBulkCSVFileRecord
需要的列元数据类型就是java.sql.JDBCType
里的类型,通过java.sql.JDBCType.getVendorTypeNumber
方法获取到int值。
本例文件格式:textfile,字段分隔符(delimiter)‘|’
代码,kotlin格式
import java.sql.JDBCType
import com.microsoft.sqlserver.jdbc.*
import java.sql.DriverManager
import java.sql.SQLException
import java.sql.Statement
import java.sql.Connection
val database ="db"
val schema = "sc"
val record: SQLServerBulkCSVFileRecord = SQLServerBulkCSVFileRecord(
"path of the data file", "utf-8", "delimiter", "firstLineIsColumnNames"
)
destTblName = "${schema}.${table}"
// 注意要添加所有字段的元数据信息。
record.addColumnMetadata(
"position of this field: start from 1",
"field name",
"jdbc type",
"precision: char/varchar length or decimal precision,date etc fill with 0",
"scale: decimal scale",
"dateTimeFormatter")
val connectionUrl =
"jdbc:sqlserver://${host}:${port};encrypt=false;databaseName=${database}"
DriverManager.getConnection(connectionUrl, "username", "password").use{conn ->
conn.createStatement().use { stmt ->
SQLServerBulkCopy(conn).use { bulkCopy ->
// delete before bulk load!
// stmt.executeUpdate("DELETE FROM ${tpc.name}")
bulkCopy.destinationTableName = destTblName
// colMapSupplier.forEach{(k,v)-> bulkCopy.addColumnMapping(k,v)}
// Write from the source to the destination.
bulkCopy.writeToServer(record)
}
}
}