Jfinal+SQLite java工具类复制mysql表数据到 *.sqlite

复制代码
处理了时间类型
package changeDataBase;

import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MySQLToSQLiteMigration {
    private static final String MYSQL_URL = "jdbc:mysql://localhost:3306/datebaseName";
    private static final String MYSQL_USER = "user";
    private static final String MYSQL_PASSWORD = "123456";
    private static final String SQLITE_URL = "jdbc:sqlite:D:/database/datebaseName.sqlite";

    public static void main(String[] args) {
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException var2) {
            System.err.println("SQLite JDBC driver not found!");
            var2.printStackTrace();
            return;
        }

        List<String> tableNames = getTableNamesFromMySQL();
        migrateTablesToSQLite(tableNames);
    }

    private static List<String> getTableNamesFromMySQL() {
        ArrayList<String> tableNames = new ArrayList<>();

        try (Connection conn = DriverManager.getConnection(MYSQL_URL, MYSQL_USER, MYSQL_PASSWORD)) {
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet rs = metaData.getTables(null, null, "%", new String[]{"TABLE"});

            while (rs.next()) {
                tableNames.add(rs.getString("TABLE_NAME"));
            }
        } catch (SQLException var6) {
            var6.printStackTrace();
        }

        return tableNames;
    }

    private static void migrateTablesToSQLite(List<String> tableNames) {
        try (Connection mysqlConn = DriverManager.getConnection(MYSQL_URL, MYSQL_USER, MYSQL_PASSWORD);
             Connection sqliteConn = DriverManager.getConnection(SQLITE_URL)) {

            Iterator<String> var3 = tableNames.iterator();

            while (var3.hasNext()) {
                String tableName = var3.next();
                System.out.println("Migrating table: " + tableName);
                migrateTable(mysqlConn, sqliteConn, tableName);
            }
        } catch (SQLException var9) {
            var9.printStackTrace();
        }
    }

    private static void migrateTable(Connection mysqlConn, Connection sqliteConn, String tableName) throws SQLException {
        String selectSql = "SELECT * FROM " + tableName;
        try (Statement stmt = mysqlConn.createStatement();
             ResultSet rs = stmt.executeQuery(selectSql)) {

            String createTableSql = getCreateTableSql(mysqlConn, tableName);
            try (Statement sqliteStmt = sqliteConn.createStatement()) {
                sqliteStmt.execute(createTableSql);
            }

            String insertSql = getInsertSql(rs.getMetaData(), tableName);
            try (PreparedStatement sqlitePstmt = sqliteConn.prepareStatement(insertSql)) {
                while (rs.next()) {
                    for (int i = 1; i <= rs.getMetaData().getColumnCount(); ++i) {
                        String columnName = rs.getMetaData().getColumnName(i);
                        String columnType = rs.getMetaData().getColumnTypeName(i);

                        // 特殊处理时间字段
                        if ("DATETIME".equalsIgnoreCase(columnType) || "TIMESTAMP".equalsIgnoreCase(columnType)) {
                            Object value = rs.getObject(i);
                            if (value instanceof java.sql.Timestamp) {
                                // 将 Timestamp 转换为标准日期时间格式
                                java.sql.Timestamp timestamp = (java.sql.Timestamp) value;
                                sqlitePstmt.setString(i, timestamp.toString());
                            } else {
                                sqlitePstmt.setObject(i, value);
                            }
                        } else {
                            sqlitePstmt.setObject(i, rs.getObject(i));
                        }
                    }
                    sqlitePstmt.addBatch();
                }
                sqlitePstmt.executeBatch();
            }
        }
    }

    private static String getCreateTableSql(Connection mysqlConn, String tableName) throws SQLException {
        DatabaseMetaData metaData = mysqlConn.getMetaData();
        ResultSet rs = metaData.getColumns(null, null, tableName, "%");

        StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ");
        sb.append(tableName).append(" (");

        List<String> columns = new ArrayList<>();
        String primaryKey = null;

        while (rs.next()) {
            String columnName = rs.getString("COLUMN_NAME");
            String columnType = getSQLiteType(rs.getString("TYPE_NAME"));
            columns.add(columnName + " " + columnType);
        }

        // 获取主键信息
        String primaryKeySql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND CONSTRAINT_NAME = 'PRIMARY'";
        try (PreparedStatement pstmt = mysqlConn.prepareStatement(primaryKeySql)) {
            pstmt.setString(1, "datebaseName");
            pstmt.setString(2, tableName);
            try (ResultSet pkRs = pstmt.executeQuery()) {
                if (pkRs.next()) {
                    primaryKey = pkRs.getString("COLUMN_NAME");
                }
            }
        }

        sb.append(String.join(", ", columns));
        if (primaryKey != null) {
            sb.append(", PRIMARY KEY (").append(primaryKey).append(")");
        }

        sb.append(");");
        return sb.toString();
    }

    private static String getInsertSql(ResultSetMetaData metaData, String tableName) throws SQLException {
        StringBuilder sb = new StringBuilder("INSERT INTO ").append(tableName).append(" (");

        for (int i = 1; i <= metaData.getColumnCount(); ++i) {
            sb.append(metaData.getColumnName(i));
            if (i < metaData.getColumnCount()) {
                sb.append(", ");
            }
        }

        sb.append(") VALUES (");

        for (int i = 1; i <= metaData.getColumnCount(); ++i) {
            sb.append("?");
            if (i < metaData.getColumnCount()) {
                sb.append(", ");
            }
        }

        sb.append(");");
        return sb.toString();
    }

    private static String getSQLiteType(String mysqlType) {
        switch (mysqlType.toUpperCase()) {
            case "INT":
            case "INTEGER":
                return "INTEGER";
            case "VARCHAR":
            case "CHAR":
                return "TEXT";
            case "DATE":
                return "DATE";
            case "DATETIME":
            case "TIMESTAMP":
                return "DATETIME";
            case "DECIMAL":
                return "NUMERIC";
            case "FLOAT":
            case "DOUBLE":
                return "REAL";
            default:
                return "TEXT";
        }
    }
}
复制代码
package javaBean;

/**
 * @author 
 * @date 2025/7/4 13:33
 * @desc 时间类型转换
 */

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {
    private static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static final SimpleDateFormat DEFAULT_DAY_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    public static Date parseDate(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null; // 如果输入字符串为 null 或空,直接返回 null
        }
        try {
            return DEFAULT_DATE_FORMAT.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return null; // 如果解析失败,返回 null
        }
    }

    public static String formatDate(Date date) {
        if (date == null) {
            return null; // 如果日期为 null,返回 null
        }
        return DEFAULT_DATE_FORMAT.format(date);
    }


    public static String formatDateDay(Date date) {
        if (date == null) {
            return null; // 如果日期为 null,返回 null
        }
        return DEFAULT_DAY_FORMAT.format(date);
    }
    public static Date parseDay(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null; // 如果输入字符串为 null 或空,直接返回 null
        }
        try {
            return DEFAULT_DAY_FORMAT.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return null; // 如果解析失败,返回 null
        }
    }
}
相关推荐
sg_knight20 分钟前
Spring Cloud Gateway全栈实践:动态路由能力与WebFlux深度整合
java·spring boot·网关·spring·spring cloud·微服务·gateway
JosieBook33 分钟前
【IDEA】IntelliJ IDEA 中文官方文档全面介绍与总结
java·ide·intellij-idea
三只蛋黄派36 分钟前
Websocket
java
JIngJaneIL40 分钟前
专利服务系统平台|个人专利服务系统|基于java和小程序的专利服务系统设计与实现(源码+数据库+文档)
java·数据库·小程序·论文·毕设·专利服务系统平台
崎岖Qiu43 分钟前
leetcode1343:大小为K的子数组(定长滑动窗口)
java·算法·leetcode·力扣·滑动窗口
freed_Day1 小时前
Java学习进阶--集合体系结构
java·开发语言·学习
zuozewei1 小时前
高可用改造之构建双活冗余的TDengine时序数据处理架构
java·架构·tdengine
嫩萝卜头儿2 小时前
从零掌握 Java AWT:原理、实战与性能优化
java·开发语言·性能优化
都叫我大帅哥2 小时前
Java ZGC垃圾收集器:低延迟的终极武器,全面解析与实战指南
java·jvm
Jason?132 小时前
Unity基于Recoder的API写了一个随时录屏的工具
java·unity·游戏引擎