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
        }
    }
}
相关推荐
程序员黑豆5 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
hey_sml6 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo6 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖7 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才8 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio8 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖9 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
灯澜忆梦9 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
不老刘10 小时前
【Java入门】Java服务部署方式全景对比:从java -jar到K8s
java·kubernetes·jar
C++ 老炮儿的技术栈11 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio