From 75ad55318c0c1222aba589c70316265022b9e1f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com>
Date: Sat, 4 Jan 2025 09:15:54 +0800
Subject: [PATCH] 'commit'
---
pom.xml | 7 +-
src/main/java/Tools/DatabaseSynchronizer.java | 271 ++++++++++++++++++
2 files changed, 277 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/Tools/DatabaseSynchronizer.java
diff --git a/pom.xml b/pom.xml
index 9ae4217a..de470025 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,7 +72,12 @@
pdf-jar
1.0
-
+
+
+ org.xerial
+ sqlite-jdbc
+ 3.42.0.0
+
org.apache.pdfbox
diff --git a/src/main/java/Tools/DatabaseSynchronizer.java b/src/main/java/Tools/DatabaseSynchronizer.java
new file mode 100644
index 00000000..959f5a19
--- /dev/null
+++ b/src/main/java/Tools/DatabaseSynchronizer.java
@@ -0,0 +1,271 @@
+package Tools;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DatabaseSynchronizer {
+ // 数据库连接配置
+ private static final String SQLITE_URL = "jdbc:sqlite:D:\\dsWork\\CcsEduData\\数据库与脚本\\edudb_gather_220100000000_full_fullreport.db";
+ private static final String PG_URL = "jdbc:postgresql://10.10.14.71:5432/szjz_db";
+ private static final String PG_USER = "postgres";
+ private static final String PG_PASSWORD = "DsideaL147258369";
+
+ public void syncDatabase() {
+ // 要同步的表名列表
+ List tables = List.of("教基1001", "教基4149", "教基3115", "教基2107");
+
+ try {
+ // 加载数据库驱动
+ Class.forName("org.sqlite.JDBC");
+ Class.forName("org.postgresql.Driver");
+
+ // 同步每个表
+ for (String tableName : tables) {
+ syncTable(tableName);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void syncTable(String tableName) throws SQLException {
+ // 获取表结构和数据
+ TableInfo tableInfo = getTableInfo(tableName);
+ List> data = getTableData(tableName);
+
+ // 在PostgreSQL中创建表并插入数据
+ createTableInPostgres(tableInfo);
+ insertDataToPostgres(tableInfo, data);
+ }
+
+ private TableInfo getTableInfo(String tableName) throws SQLException {
+ TableInfo tableInfo = new TableInfo(tableName);
+
+ try (Connection conn = DriverManager.getConnection(SQLITE_URL);
+ ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null)) {
+
+ while (rs.next()) {
+ String columnName = rs.getString("COLUMN_NAME");
+ String sqliteType = rs.getString("TYPE_NAME");
+ // 转换SQLite类型到PostgreSQL类型
+ String pgType = convertSqliteTypeToPg(sqliteType);
+ tableInfo.addColumn(columnName, pgType);
+ }
+ }
+ return tableInfo;
+ }
+
+
+
+ private void createTableInPostgres(TableInfo tableInfo) throws SQLException {
+ StringBuilder createTableSQL = new StringBuilder();
+ createTableSQL.append("CREATE TABLE IF NOT EXISTS ")
+ .append(tableInfo.tableName)
+ .append(" (");
+
+ for (int i = 0; i < tableInfo.columnNames.size(); i++) {
+ if (i > 0) createTableSQL.append(", ");
+ createTableSQL.append(tableInfo.columnNames.get(i))
+ .append(" ")
+ .append(tableInfo.columnTypes.get(i));
+ }
+ createTableSQL.append(")");
+
+ try (Connection conn = DriverManager.getConnection(PG_URL, PG_USER, PG_PASSWORD);
+ Statement stmt = conn.createStatement()) {
+ stmt.execute(createTableSQL.toString());
+ }
+ }
+ private void insertDataToPostgres(TableInfo tableInfo, List> data) throws SQLException {
+ if (data.isEmpty()) {
+ System.out.println("没有数据需要插入");
+ return;
+ }
+
+ try (Connection conn = DriverManager.getConnection(PG_URL, PG_USER, PG_PASSWORD)) {
+ conn.setAutoCommit(false);
+
+ StringBuilder insertSQL = new StringBuilder();
+ insertSQL.append("INSERT INTO ")
+ .append(tableInfo.tableName)
+ .append(" (");
+
+ for (int i = 0; i < tableInfo.columnNames.size(); i++) {
+ if (i > 0) insertSQL.append(", ");
+ insertSQL.append(tableInfo.columnNames.get(i));
+ }
+
+ insertSQL.append(") VALUES (");
+
+ for (int i = 0; i < tableInfo.columnNames.size(); i++) {
+ if (i > 0) insertSQL.append(", ");
+ insertSQL.append("?");
+ }
+
+ insertSQL.append(")");
+
+ System.out.println("插入SQL: " + insertSQL);
+
+ try (PreparedStatement pstmt = conn.prepareStatement(insertSQL.toString())) {
+ int batchSize = 1000;
+ int count = 0;
+ int totalInserted = 0;
+
+ for (List