一、工具类封装
package com.example.demo.v2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingDeque;
@Slf4j
public class JdbcUtils {
private static int shardingCount = 100000;
private static int batchAddCount = 500;
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(String url,String username,String password) {
Connection conn= null;
try {
conn = DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static List<Map<String,Object>> query(Connection connection,String sql) {
List<Map<String,Object>> elements = new ArrayList<>();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
long start = System.currentTimeMillis();
try {
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnLen = metaData.getColumnCount();
while (resultSet.next()) {
Map<String, Object> element = new HashMap<>(columnLen);
for (int j = 0; j < columnLen; j++) {
String columnName = metaData.getColumnName(j + 1);
element.put(columnName, resultSet.getObject(columnName));
}
elements.add(element);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
release(null,preparedStatement,resultSet);
}
long end = System.currentTimeMillis();
log.info("select方法执行sql = {} 查询完成,共查询出: {}条数据,共耗时:{}秒",sql,elements.size(),(end - start) / 1000);
return elements;
}
public static void batchAdd(Connection connection, String sql,
LinkedBlockingDeque<List<Map<String, Object>>> shardingList,
String[] keyArray){
PreparedStatement preparedStatement = null;
try {
connection.setAutoCommit(false);
preparedStatement = connection.prepareStatement(sql);
for (List<Map<String, Object>> list : shardingList) {
for (int i = 0; i < list.size(); i++) {
Map<String, Object> data = list.get(i);
try {
dynamicColumn(preparedStatement,data,keyArray).addBatch();
if ((i + 1) % batchAddCount == 0) {
preparedStatement.executeBatch();
preparedStatement.clearBatch();
connection.commit();
log.info("batchAdd方法执行批处理条数:{}",(i + 1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
preparedStatement.executeBatch();
preparedStatement.clearBatch();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
release(null,preparedStatement,null);
}
}
public static PreparedStatement dynamicColumn(PreparedStatement preparedStatement, Map<String, Object> map,String[] keyArray){
try {
for (int i = 1;i <= keyArray.length;i++){
String key = keyArray[i - 1];
String value = String.valueOf(map.get(key));
preparedStatement.setObject(i,value);
}
} catch (SQLException e) {
e.printStackTrace();
}
return preparedStatement;
}
public static LinkedBlockingDeque<List<Map<String, Object>>> sharding(List<Map<String, Object>> maps){
LinkedBlockingDeque<List<Map<String, Object>>> blockingDeque = new LinkedBlockingDeque();
if (!CollectionUtils.isEmpty(maps)){
int size = maps.size();
int batch = maps.size() % shardingCount == 0 ? maps.size() / shardingCount : maps.size() / shardingCount + 1;
for (int i = 0;i < batch;i++){
List<Map<String, Object>> dataSharding;
if (i == (batch - 1)){
dataSharding = maps.subList(i * shardingCount, size);
}else{
dataSharding = maps.subList(i * shardingCount, (i + 1) * shardingCount);
}
blockingDeque.add(dataSharding);
}
log.info("sharding方法执行数据分片完成");
}
return blockingDeque;
}
public static void createTable(Connection connection,String createTableSql){
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(createTableSql);
int i = preparedStatement.executeUpdate(createTableSql);
log.info("renameTable方法执行sql = {} ,result = {}",createTableSql,i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
release(null,preparedStatement,null);
}
}
public static void renameTable(Connection connection,String tableName,String newTableName){
PreparedStatement preparedStatement = null;
try {
String sql = "rename table " + tableName + " to " + newTableName;
preparedStatement = connection.prepareStatement(sql);
int i = preparedStatement.executeUpdate(sql);
log.info("renameTable方法执行sql = {} ,result = {}",sql,i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
release(null,preparedStatement,null);
}
}
public static void dropTable(Connection connection,String tableName){
PreparedStatement preparedStatement = null;
try {
String sql = "drop table if exists " + tableName;
preparedStatement = connection.prepareStatement(sql);
int i = preparedStatement.executeUpdate(sql);
log.info("dropTable方法执行sql = {} ,result = {}",sql,i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
release(null,preparedStatement,null);
}
}
public static void truncateTable(Connection connection,String tableName){
PreparedStatement preparedStatement = null;
try {
String sql = "truncate " + tableName;
preparedStatement = connection.prepareStatement(sql);
boolean execute = preparedStatement.execute();
log.info("truncateTable方法执行sql = {} ,result = {}",sql,execute);
} catch (SQLException e) {
e.printStackTrace();
}finally {
release(null,preparedStatement,null);
}
}
public static void release(Connection connection, PreparedStatement preparedStatement,ResultSet resultSet) {
try {
if (resultSet != null){
resultSet.close();
}
if (preparedStatement != null){
preparedStatement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
二、使用demo
public static void main(String[] args) {
String url = "jdbc:mysql://127.0.0.1:3306/mysql?userUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true";
String user = "root";
String password = "zte@Unicom20";
Connection connection = JdbcUtils.getConnection(url, user, password);
String sql = "select * from table";
List<Map<String, Object>> list = JdbcUtils.query(connection, sql);
LinkedBlockingDeque<List<Map<String, Object>>> shardingList = JdbcUtils.sharding(list);
String insertSql = "insert into table(column1,column2,column1) values(value1,value2,value3)";
JdbcUtils.batchAdd(connection,insertSql,shardingList,getInsertTableSqlColumns());
JdbcUtils.release(connection,null,null);
}