package com.vcarecity.cvs.service.impl; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.vcarecity.cvs.core.ColumnUpdateMapper; import com.vcarecity.cvs.properties.AppProperties; import com.vcarecity.cvs.service.ResultHandlerService; import com.vcarecity.cvs.util.CreateDatasource; import com.zaxxer.hikari.HikariDataSource; import lombok.extern.slf4j.Slf4j; import java.sql.Connection; import java.sql.Date; import java.sql.Statement; import java.sql.Timestamp; import java.util.List; /** * @author Kerry on 19/11/21 */ @Slf4j public class MySQLResultStatHandlerServiceImpl implements ResultHandlerService { private final String sql; private final HikariDataSource dataSource; @Inject public MySQLResultStatHandlerServiceImpl(AppProperties properties, @Assisted Object sql) { this.sql = (String) sql; this.dataSource = CreateDatasource.createDataSource(properties.getToDb()); } @Override public void resultHandler(String table, String[] header, List dataList) throws Exception { long startTime = System.currentTimeMillis(); StringBuffer sb = new StringBuffer(); final String[] newHeaders = ColumnUpdateMapper.updateColumnName(table, header); final String column = String.join(",", newHeaders); sb.append("INSERT INTO ").append(table).append("(").append(String.join(",", column)).append(") VALUES "); for (T t : dataList) { if (t.getClass().isArray()) { Object[] rows = (Object[]) t; sb.append("("); for (int i = 0; i < header.length; i++) { Object row = rows[i]; if (row instanceof String) { sb.append("'").append(row).append("'"); } else if (row instanceof Date) { sb.append("'").append(row).append("'"); } else if (row instanceof Timestamp) { sb.append("'").append(row).append("'"); } else { sb.append(row); } if (i != header.length - 1) { sb.append(","); } } sb.append("),"); } } final StringBuffer stringBuffer = sb.deleteCharAt(sb.length() - 1); // logger.debug("{}", stringBuffer.toString()); final Connection connection = dataSource.getConnection(); final Statement statement = connection.createStatement(); statement.execute(stringBuffer.toString()); statement.close(); connection.close(); logger.info("WRITE SUCCESS to mysql usage time {} /ms, size = {}", System.currentTimeMillis() - startTime, dataList.size()); } }