当前位置: 首页 > news >正文

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}}
}

文章转载自:
http://bacchii.isnyv.cn
http://aduncous.isnyv.cn
http://boomlet.isnyv.cn
http://breezee.isnyv.cn
http://battlemented.isnyv.cn
http://anarchist.isnyv.cn
http://camorra.isnyv.cn
http://arytenoid.isnyv.cn
http://amphitropous.isnyv.cn
http://chemolysis.isnyv.cn
http://carny.isnyv.cn
http://betrayer.isnyv.cn
http://anodontia.isnyv.cn
http://catadromous.isnyv.cn
http://aah.isnyv.cn
http://cercis.isnyv.cn
http://acis.isnyv.cn
http://burnish.isnyv.cn
http://aufwuch.isnyv.cn
http://anthracitic.isnyv.cn
http://brunizem.isnyv.cn
http://biographic.isnyv.cn
http://budworm.isnyv.cn
http://canescence.isnyv.cn
http://calm.isnyv.cn
http://bankroll.isnyv.cn
http://blackamoor.isnyv.cn
http://acknowledge.isnyv.cn
http://alb.isnyv.cn
http://antifoulant.isnyv.cn
http://www.dtcms.com/a/280070.html

相关文章:

  • 基于 vue+Cesium 实现军事标绘之钳击箭头绘制实战
  • C++-linux系统编程 8.进程(三)孤儿进程、僵尸进程与进程回收
  • Oracle学习专栏(五):性能优化
  • 适用于Windows系统截图工具
  • 通用综合文字识别联动 MES 系统:OCR 是数据流通的核心
  • 【算法-BFS 解决最短路问题】探索BFS在图论中的应用:最短路径问题的高效解法
  • JVM——JVM垃圾回收调优的主要目的是什么?
  • 行为模式-状态模式
  • C++ -- STL-- List
  • 分布式通信框架 - JGroups
  • 从零开始的云计算生活——第三十二天,四面楚歌,HAProxy负载均衡
  • 数据怎么分层?从ODS、DW、ADS三大层一一拆解!
  • 智慧园区:激活城市活力的数字化引擎
  • 【colab 使用uv创建一个新的python版本运行】
  • mac上的app如何自动分类
  • 22-C#的委托简单使用-2
  • 自增主键为什么不是连续的?
  • 基于多智能体强化学习的医疗检索增强生成系统研究—MMOA-RAG架构设计与实现
  • Uboot源码超详细分析(2)
  • 力扣25.7.15每日一题——有效单词
  • 对于编写PID过程中的问题
  • TCP可靠性设计的核心机制与底层逻辑
  • TDengine GREATEST 和 LEAST 函数用户手册
  • 26.将 Python 列表拆分为多个小块
  • SSM框架学习DI入门——day2
  • 跨平台移动开发技术深度分析:uni-app、React Native与Flutter的迁移成本、性能、场景与前景
  • IOS 18下openURL 失效问题
  • Flutter瀑布流布局深度实践:打造高性能动态图片墙
  • LVS(Linux Virtual Server)详细笔记(理论篇)
  • JavaScript进阶篇——第三章 箭头函数核心