# data-init **Repository Path**: lwd1314_admin/data-init ## Basic Information - **Project Name**: data-init - **Description**: 数据库以及表初始安装工具 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-09-09 - **Last Updated**: 2025-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据库初始化工具包 这是一个用于数据库初始化的Java工具包,支持自动检测数据库是否存在、创建数据库、执行SQL文件等功能。 ## 功能特性 1. **数据库配置管理** - 支持配置数据库URL、用户名、密码、库名和字符编码 2. **智能数据库检测** - 自动检测数据库是否存在,存在则跳过创建 3. **延迟连接初始化** - 先使用基础连接创建数据库,再使用完整连接执行SQL 4. **SQL文件执行** - 支持执行指定目录下的所有SQL文件 5. **执行记录跟踪** - 自动记录已执行的SQL文件,避免重复执行 6. **事务支持** - 每个SQL文件在独立事务中执行,失败时自动回滚 7. **文件哈希校验** - 通过文件哈希值判断文件是否已执行过 ## 项目结构 ``` src/main/java/cn/tuzirpa/ ├── App.java # 主程序入口 ├── config/ │ └── DatabaseConfig.java # 数据库配置类 ├── manager/ │ └── DatabaseManager.java # 数据库管理器 ├── executor/ │ └── SqlFileExecutor.java # SQL文件执行器 └── tracker/ └── SqlExecutionTracker.java # SQL执行记录跟踪器 ``` ## 依赖说明 - **MySQL驱动**: mysql-connector-java 8.0.33 - **日志框架**: SLF4J + Logback - **JSON处理**: Jackson ## 使用方法 ### 1. 编译项目 ```bash mvn clean compile ``` ### 2. 运行程序 ```bash mvn exec:java -Dexec.mainClass="cn.tuzirpa.App" ``` ### 3. 配置数据库 程序启动后会提示输入数据库配置信息: - 数据库URL (例如: `jdbc:mysql://localhost:3306`) - 用户名 - 密码 - 数据库名 - 字符编码 (默认: utf8mb4,注意:连接参数中使用UTF-8) ### 4. 使用功能 程序提供以下功能: 1. **执行SQL文件目录** - 输入SQL文件所在目录路径,程序会自动执行该目录下的所有.sql文件 2. **查看执行历史** - 显示最近20条SQL文件执行记录 3. **清理执行记录** - 清空所有执行记录(谨慎使用) 4. **退出程序** ## 执行记录表 程序会在数据库中自动创建 `sql_execution_log` 表来跟踪SQL文件执行记录: ```sql CREATE TABLE `sql_execution_log` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `file_name` VARCHAR(255) NOT NULL, `file_path` VARCHAR(500) NOT NULL, `file_hash` VARCHAR(64) NOT NULL, `execution_time` DATETIME NOT NULL, `execution_status` VARCHAR(20) NOT NULL, `error_message` TEXT, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY `uk_file_hash` (`file_hash`), KEY `idx_file_name` (`file_name`), KEY `idx_execution_time` (`execution_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` ## SQL文件要求 - 文件扩展名必须是 `.sql` - 支持多行SQL语句,以分号 `;` 分隔 - 支持SQL注释 (`--` 或 `#` 开头) - 支持多行注释 (`/* */`) - 文件编码建议使用UTF-8 ## 示例SQL文件 ```sql -- 创建用户表 CREATE TABLE IF NOT EXISTS `users` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR(50) NOT NULL UNIQUE, `email` VARCHAR(100) NOT NULL, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 插入初始数据 INSERT INTO `users` (`username`, `email`) VALUES ('admin', 'admin@example.com'), ('user1', 'user1@example.com'); ``` ## 注意事项 1. 确保MySQL服务正在运行 2. 确保数据库用户有创建数据库和执行SQL的权限 3. SQL文件按文件名排序执行 4. 每个SQL文件在独立事务中执行 5. 已执行的SQL文件不会重复执行(基于文件哈希值判断) ## 连接逻辑说明 程序使用两阶段连接策略: 1. **基础连接阶段**: 使用不包含数据库名的URL连接MySQL服务器 - 用于检测数据库是否存在 - 用于创建数据库(如果不存在) - 连接URL示例: `jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=UTF-8` 2. **完整连接阶段**: 使用包含数据库名的URL连接特定数据库 - 用于执行SQL文件 - 用于管理执行记录 - 连接URL示例: `jdbc:mysql://localhost:3306/my_database?useUnicode=true&characterEncoding=UTF-8` ## 字符编码说明 - **数据库字符集**: 支持utf8mb4等MySQL字符集,用于创建数据库和表 - **连接字符编码**: JDBC连接参数中使用UTF-8,这是MySQL驱动支持的标准编码 - **文件编码**: SQL文件建议使用UTF-8编码保存 程序会自动处理字符编码的转换,确保数据正确存储和读取。 ## 故障排除 ### 连接失败 - 检查MySQL服务是否启动 - 检查数据库URL、用户名、密码是否正确 - 检查网络连接 ### SQL执行失败 - 检查SQL语法是否正确 - 检查数据库权限 - 查看日志文件获取详细错误信息 ### 文件编码问题 - 确保SQL文件使用UTF-8编码 - 检查数据库字符集设置 ### IDE运行问题 - 在IDE中运行交互式程序时可能出现输入流问题 - 建议使用命令行版本或非交互式测试 - 使用 `CommandLineApp` 类避免交互式输入 ### 数据库检测问题 - 程序使用 `SHOW DATABASES LIKE ?` 命令检测数据库是否存在 - 兼容不同版本的MySQL驱动和数据库版本 - 如果遇到列名错误,请确保MySQL驱动版本与数据库版本匹配 ### SQL解析问题 - 程序按分号(`;`)分割SQL语句 - 自动过滤空行 - 注释由MySQL数据库自动处理,无需手动移除 ## 开发说明 如需扩展功能,可以: 1. 修改 `DatabaseConfig` 类添加新的配置项 2. 扩展 `SqlFileExecutor` 类支持更多SQL文件格式 3. 修改 `SqlExecutionTracker` 类自定义执行记录逻辑 4. 在 `App` 类中添加新的菜单选项 ## 许可证 本项目采用MIT许可证。