| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package datahelper;
- import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
- import java.lang.reflect.Method;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.Types;
- /**
- *
- * @author Lisewski
- */
- public class DataHelper {
- static Method[] colMethods;
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) throws Exception {
- }
- public static int CopyData(Connection sourceCon, Connection targetCon, String sourceSql, String targetTable, boolean dropTargetTable) throws Exception {
- var iRow = 0;
- var iBuffer = 50000;
- var sourceCommand = sourceCon.createStatement();
- var dataReader = sourceCommand.executeQuery(sourceSql);
- var schemaTable = dataReader.getMetaData();
- targetCon.setAutoCommit(false);
- // create the insert statement and create table if it doesn't exist
- CreateTable(targetCon, schemaTable, targetTable, dropTargetTable);
- // if target is sqlserver do a bulkcopy
- if (targetCon.getMetaData().getDriverName().contains("SQL Server")) {
- SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(targetCon);
- bulkCopy.setDestinationTableName(targetTable);
- bulkCopy.writeToServer(dataReader);
- targetCon.commit();
- var cmd = targetCon.createStatement();
- var rs = cmd.executeQuery(String.format("SELECT COUNT(1) FROM %s", targetTable));
- rs.next();
- iRow = rs.getInt(1);
- } else {
- var targetCommand = PrepareCommand(targetCon, schemaTable, targetTable);
- while (dataReader.next()) {
- iRow++;
- SetParams(dataReader, schemaTable, targetCommand);
- targetCommand.addBatch();
- if (iRow % iBuffer == 0) {
- targetCommand.executeBatch();
- targetCon.commit();
- }
- }
- if (iRow % iBuffer != 0) {
- targetCommand.executeBatch();
- targetCon.commit();
- }
- }
- return iRow;
- }
- private static void CreateTable(Connection dbConnection, ResultSetMetaData schemaTable, String tableName, boolean withDrop) throws Exception {
- var dbTypeName = dbConnection.getMetaData().getDriverName();
- System.out.println(dbTypeName);
- if (withDrop) {
- try {
- dbConnection.createStatement().executeUpdate(String.format("DROP TABLE IF EXISTS %s", tableName));
- dbConnection.commit();
- } catch (Exception ex) {
- dbConnection.createStatement().executeUpdate(String.format("DROP TABLE %s", tableName));
- dbConnection.commit();
- }
- }
- var createNotExists = (dbTypeName.contains("SQL Server"))
- ? String.format("IF OBJECT_ID('%s') IS NULL CREATE TABLE", tableName)
- : "CREATE TABLE IF NOT EXISTS";
- if (dbTypeName.contains("Derby")) {
- createNotExists = "CREATE TABLE";
- }
- var Sql = new StringBuilder(String.format("%s %s (", createNotExists, tableName));
- var iColumns = schemaTable.getColumnCount();
- colMethods = new Method[iColumns];
- for (var i = 1; i < iColumns + 1; i++) {
- if (i > 1) {
- Sql.append(", ");
- }
- var name = schemaTable.getColumnName(i);
- var dt = schemaTable.getColumnTypeName(i);
- var type = schemaTable.getColumnType(i);
- var size = schemaTable.getPrecision(i);
- var nullable = schemaTable.isNullable(i) == 1;
-
- colMethods[i-1] = getAccessMethod(type);
- Sql.append(String.format("%s %s", '"' + name + '"', dt));
- if (dt.toLowerCase().endsWith("char")) {
- Sql.append(String.format("(%d)", size));
- }
- if (!nullable) {
- Sql.append(" NOT NULL");
- }
- }
- Sql.append(")");
- var sqlString = Sql.toString();
- if (dbTypeName.contains("PostgreSQL") || dbTypeName.contains("Derby")) {
- sqlString = sqlString.replaceAll("datetime", "timestamp");
- sqlString = sqlString.replaceAll("tinyint", "int");
- sqlString = sqlString.replaceAll("bit", "boolean");
- }
- var createCommand = dbConnection.createStatement();
- System.out.println(sqlString);
- // Assume the table already exists and ignore the create
- try {
- createCommand.executeUpdate(sqlString);
- dbConnection.commit();
- } catch (Exception ex) {
- }
- }
- private static PreparedStatement PrepareCommand(Connection dbConnection, ResultSetMetaData schemaTable, String tableName) throws Exception {
- var sbFields = new StringBuilder();
- var sbFmtValues = new StringBuilder();
- var iColumns = schemaTable.getColumnCount();
- for (var i = 1; i < iColumns + 1; i++) {
- var columnName = schemaTable.getColumnName(i);
- sbFields.append(i > 1 ? ", " : "");
- sbFields.append('"' + columnName + '"');
- sbFmtValues.append(i > 1 ? ", " : "");
- sbFmtValues.append("?");
- }
- var insertSql = String.format("INSERT INTO %s (%s) VALUES (%s)", tableName, sbFields.toString(), sbFmtValues.toString());
- System.out.println(insertSql);
- var cmd = dbConnection.prepareStatement(insertSql);
- return cmd;
- }
- private static void SetParams(ResultSet dr, ResultSetMetaData schemaTable, PreparedStatement cmd) throws Exception {
- var iColumns = schemaTable.getColumnCount();
- for (var i = 1; i < iColumns + 1; i++) {
- // cmd.setObject(i, dr.getObject(i), dr.getType());
- cmd.setObject(i, colMethods[i-1].invoke(dr, i));
- }
- }
- private static Method getAccessMethod(int type) throws Exception {
- switch (type) {
- case Types.BIT:
- case Types.TINYINT:
- case Types.SMALLINT:
- case Types.INTEGER:
- return ResultSet.class.getMethod("getInt", int.class);
- case Types.BIGINT:
- return ResultSet.class.getMethod("getLong", int.class);
- case Types.FLOAT:
- return ResultSet.class.getMethod("getFloat", int.class);
- case Types.REAL:
- case Types.DOUBLE:
- case Types.NUMERIC:
- case Types.DECIMAL:
- return ResultSet.class.getMethod("getLong", int.class);
- case Types.CHAR:
- case Types.VARCHAR:
- case Types.LONGVARCHAR:
- return ResultSet.class.getMethod("getString", int.class);
- case Types.DATE:
- return ResultSet.class.getMethod("getDate", int.class);
- case Types.TIME:
- return ResultSet.class.getMethod("getTime", int.class);
- case Types.TIMESTAMP:
- return ResultSet.class.getMethod("getTimestamp", int.class);
- case Types.BINARY:
- case Types.VARBINARY:
- case Types.LONGVARBINARY:
- case Types.NULL:
- case Types.OTHER:
- case Types.JAVA_OBJECT:
- case Types.DISTINCT:
- case Types.STRUCT:
- case Types.ARRAY:
- case Types.BLOB:
- case Types.CLOB:
- case Types.NCLOB:
- case Types.REF:
- case Types.DATALINK:
- return ResultSet.class.getMethod("getBlob", int.class);
- case Types.BOOLEAN:
- return ResultSet.class.getMethod("getInt", int.class);
- case Types.ROWID:
- case Types.NCHAR:
- case Types.NVARCHAR:
- case Types.LONGNVARCHAR:
- case Types.SQLXML:
- return ResultSet.class.getMethod("getString", int.class);
- }
- return ResultSet.class.getMethod("getObject", int.class);
- }
- }
|