# autoMakeSql **Repository Path**: china-jiangdong/auto-make-sql ## Basic Information - **Project Name**: autoMakeSql - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-06 - **Last Updated**: 2025-02-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # autoMakeSql #### 介绍 基于vue3、java8、spring、mybatis,在web端填写数据库字段的名称(汉字)、字段名(英文字母和下划线)、字段类型、注释等信息,就可以在mysql数据库自动创建数据库表单,自动生成数据库增删改查的代码。同时支持web端根据excel中保存的数据自动创建mysql数据库表单,自动生成数据库增删改查的代码。 #### 软件架构 后端部分(Java 8、Spring、MyBatis) 1. 项目搭建 使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加以下依赖: Spring Web MyBatis Framework MySQL Driver Apache POI(用于处理 Excel 文件) 2. 数据库配置 在 application.properties 中配置 MySQL 数据库连接信息: properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 3. 实体类 创建 ColumnInfo 类来存储字段信息: java package com.example.demo.entity; import lombok.Data; @Data public class ColumnInfo { private String chineseName; private String columnName; private String columnType; private String comment; } 4. 服务层 创建 DatabaseService 接口和实现类: java package com.example.demo.service; import com.example.demo.entity.ColumnInfo; import org.apache.poi.ss.usermodel.Workbook; import java.util.List; public interface DatabaseService { String createTableFromFields(List columnInfos, String tableName); String createTableFromExcel(Workbook workbook, String tableName); String generateCrudCode(String tableName); } java package com.example.demo.service.impl; import com.example.demo.entity.ColumnInfo; import com.example.demo.service.DatabaseService; import org.apache.poi.ss.usermodel.*; import org.springframework.stereotype.Service; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.ArrayList; import java.util.List; @Service public class DatabaseServiceImpl implements DatabaseService { @Override public String createTableFromFields(List columnInfos, String tableName) { try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database_name", "your_username", "your_password"); Statement statement = connection.createStatement()) { StringBuilder sql = new StringBuilder("CREATE TABLE " + tableName + " ("); for (ColumnInfo columnInfo : columnInfos) { sql.append(columnInfo.getColumnName()).append(" ").append(columnInfo.getColumnType()); if (columnInfo.getComment() != null && !columnInfo.getComment().isEmpty()) { sql.append(" COMMENT '").append(columnInfo.getComment()).append("'"); } sql.append(", "); } sql.delete(sql.length() - 2, sql.length()); sql.append(")"); statement.executeUpdate(sql.toString()); return "表创建成功"; } catch (Exception e) { e.printStackTrace(); return "表创建失败: " + e.getMessage(); } } @Override public String createTableFromExcel(Workbook workbook, String tableName) { Sheet sheet = workbook.getSheetAt(0); List columnInfos = new ArrayList<>(); for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); ColumnInfo columnInfo = new ColumnInfo(); columnInfo.setChineseName(getCellValueAsString(row.getCell(0))); columnInfo.setColumnName(getCellValueAsString(row.getCell(1))); columnInfo.setColumnType(getCellValueAsString(row.getCell(2))); columnInfo.setComment(getCellValueAsString(row.getCell(3))); columnInfos.add(columnInfo); } return createTableFromFields(columnInfos, tableName); } private String getCellValueAsString(Cell cell) { if (cell == null) { return ""; } switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: return String.valueOf((int) cell.getNumericCellValue()); default: return ""; } } @Override public String generateCrudCode(String tableName) { StringBuilder code = new StringBuilder(); // 生成增删改查代码示例 code.append("// 插入语句\n"); code.append("INSERT INTO ").append(tableName).append(" ("); // 这里需要根据字段信息完善列名 code.append(") VALUES ("); // 这里需要根据字段信息完善值 code.append(");\n"); code.append("// 查询语句\n"); code.append("SELECT * FROM ").append(tableName).append(";\n"); code.append("// 更新语句\n"); code.append("UPDATE ").append(tableName).append(" SET "); // 这里需要根据字段信息完善更新内容 code.append(" WHERE id = ?;\n"); code.append("// 删除语句\n"); code.append("DELETE FROM ").append(tableName).append(" WHERE id = ?;\n"); return code.toString(); } } 5. 控制器层 创建 DatabaseController 处理前端请求: java package com.example.demo.controller; import com.example.demo.entity.ColumnInfo; import com.example.demo.service.DatabaseService; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; @RestController @RequestMapping("/api/database") public class DatabaseController { @Autowired private DatabaseService databaseService; @PostMapping("/createTableFromFields") public String createTableFromFields(@RequestBody List columnInfos, @RequestParam String tableName) { return databaseService.createTableFromFields(columnInfos, tableName); } @PostMapping("/createTableFromExcel") public String createTableFromExcel(@RequestParam("file") MultipartFile file, @RequestParam String tableName) { try { Workbook workbook = new XSSFWorkbook(file.getInputStream()); return databaseService.createTableFromExcel(workbook, tableName); } catch (IOException e) { e.printStackTrace(); return "文件处理失败: " + e.getMessage(); } } @GetMapping("/generateCrudCode") public String generateCrudCode(@RequestParam String tableName) { return databaseService.generateCrudCode(tableName); } } 前端部分(Vue 3) 1. 创建 Vue 3 项目 使用 Vue CLI 创建一个新的 Vue 3 项目: bash vue create database-generator --default cd database-generator 2. 安装必要的依赖 bash npm install axios 3. 创建组件 在 src/components 目录下创建 DatabaseGenerator.vue 组件: vue 4. 在 App.vue 中使用组件 vue 运行项目 启动 Spring Boot 后端项目。 启动 Vue 3 前端项目: bash npm run serve 打开浏览器,访问 http://localhost:8080,即可使用该应用进行数据库表创建和代码生成。 注意事项 请根据实际情况修改数据库连接信息。 生成的增删改查代码只是简单示例,可根据需求进一步完善。 此示例仅支持 .xlsx 格式的 Excel 文件。 上述代码,还需添加自动创建mybatis映射文件的代码 为了实现自动创建 MyBatis 映射文件的功能,我们需要对后端代码进行进一步扩展。以下是详细的修改步骤和代码示例。 后端部分(Java 8、Spring、MyBatis) 1. 新增工具类用于生成 MyBatis 映射文件 在后端项目中创建一个新的工具类 MyBatisMapperGenerator,用于生成 MyBatis 的 XML 映射文件。 java package com.example.demo.util; import com.example.demo.entity.ColumnInfo; import java.io.FileWriter; import java.io.IOException; import java.util.List; public class MyBatisMapperGenerator { public static void generateMapperFile(String tableName, List columnInfos, String filePath) { StringBuilder mapperXml = new StringBuilder(); mapperXml.append("\n"); mapperXml.append("\n"); mapperXml.append("\n"); // 生成查询所有记录的 SQL mapperXml.append(" \n"); // 生成根据 ID 查询记录的 SQL mapperXml.append(" \n"); // 生成插入记录的 SQL mapperXml.append(" \n"); mapperXml.append(" INSERT INTO ").append(tableName).append(" ("); for (int i = 0; i < columnInfos.size(); i++) { ColumnInfo columnInfo = columnInfos.get(i); mapperXml.append(columnInfo.getColumnName()); if (i < columnInfos.size() - 1) { mapperXml.append(", "); } } mapperXml.append(") VALUES ("); for (int i = 0; i < columnInfos.size(); i++) { ColumnInfo columnInfo = columnInfos.get(i); mapperXml.append("#{").append(columnInfo.getColumnName()).append("}"); if (i < columnInfos.size() - 1) { mapperXml.append(", "); } } mapperXml.append(")\n"); mapperXml.append(" \n"); // 生成更新记录的 SQL mapperXml.append(" \n"); mapperXml.append(" UPDATE ").append(tableName).append(" SET "); for (int i = 0; i < columnInfos.size(); i++) { ColumnInfo columnInfo = columnInfos.get(i); if (!columnInfo.getColumnName().equals("id")) { mapperXml.append(columnInfo.getColumnName()).append(" = #{").append(columnInfo.getColumnName()).append("}"); if (i < columnInfos.size() - 1) { mapperXml.append(", "); } } } mapperXml.append(" WHERE id = #{id}\n"); mapperXml.append(" \n"); // 生成删除记录的 SQL mapperXml.append(" \n"); mapperXml.append(" DELETE FROM ").append(tableName).append(" WHERE id = #{id}\n"); mapperXml.append(" \n"); mapperXml.append(""); try (FileWriter writer = new FileWriter(filePath)) { writer.write(mapperXml.toString()); } catch (IOException e) { e.printStackTrace(); } } private static String capitalizeFirstLetter(String str) { if (str == null || str.isEmpty()) { return str; } return Character.toUpperCase(str.charAt(0)) + str.substring(1); } } 2. 修改 DatabaseService 接口和实现类 在 DatabaseService 接口中添加生成 MyBatis 映射文件的方法: java package com.example.demo.service; import com.example.demo.entity.ColumnInfo; import org.apache.poi.ss.usermodel.Workbook; import java.util.List; public interface DatabaseService { String createTableFromFields(List columnInfos, String tableName); String createTableFromExcel(Workbook workbook, String tableName); String generateCrudCode(String tableName); String generateMyBatisMapperFile(List columnInfos, String tableName); } 在 DatabaseServiceImpl 类中实现该方法: java package com.example.demo.service.impl; import com.example.demo.entity.ColumnInfo; import com.example.demo.service.DatabaseService; import com.example.demo.util.MyBatisMapperGenerator; import org.apache.poi.ss.usermodel.*; import org.springframework.stereotype.Service; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.ArrayList; import java.util.List; @Service public class DatabaseServiceImpl implements DatabaseService { @Override public String createTableFromFields(List columnInfos, String tableName) { try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database_name", "your_username", "your_password"); Statement statement = connection.createStatement()) { StringBuilder sql = new StringBuilder("CREATE TABLE " + tableName + " ("); for (ColumnInfo columnInfo : columnInfos) { sql.append(columnInfo.getColumnName()).append(" ").append(columnInfo.getColumnType()); if (columnInfo.getComment() != null && !columnInfo.getComment().isEmpty()) { sql.append(" COMMENT '").append(columnInfo.getComment()).append("'"); } sql.append(", "); } sql.delete(sql.length() - 2, sql.length()); sql.append(")"); statement.executeUpdate(sql.toString()); return "表创建成功"; } catch (Exception e) { e.printStackTrace(); return "表创建失败: " + e.getMessage(); } } @Override public String createTableFromExcel(Workbook workbook, String tableName) { Sheet sheet = workbook.getSheetAt(0); List columnInfos = new ArrayList<>(); for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); ColumnInfo columnInfo = new ColumnInfo(); columnInfo.setChineseName(getCellValueAsString(row.getCell(0))); columnInfo.setColumnName(getCellValueAsString(row.getCell(1))); columnInfo.setColumnType(getCellValueAsString(row.getCell(2))); columnInfo.setComment(getCellValueAsString(row.getCell(3))); columnInfos.add(columnInfo); } return createTableFromFields(columnInfos, tableName); } private String getCellValueAsString(Cell cell) { if (cell == null) { return ""; } switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: return String.valueOf((int) cell.getNumericCellValue()); default: return ""; } } @Override public String generateCrudCode(String tableName) { StringBuilder code = new StringBuilder(); // 生成增删改查代码示例 code.append("// 插入语句\n"); code.append("INSERT INTO ").append(tableName).append(" ("); // 这里需要根据字段信息完善列名 code.append(") VALUES ("); // 这里需要根据字段信息完善值 code.append(");\n"); code.append("// 查询语句\n"); code.append("SELECT * FROM ").append(tableName).append(";\n"); code.append("// 更新语句\n"); code.append("UPDATE ").append(tableName).append(" SET "); // 这里需要根据字段信息完善更新内容 code.append(" WHERE id = ?;\n"); code.append("// 删除语句\n"); code.append("DELETE FROM ").append(tableName).append(" WHERE id = ?;\n"); return code.toString(); } @Override public String generateMyBatisMapperFile(List columnInfos, String tableName) { String filePath = "src/main/resources/mapper/" + capitalizeFirstLetter(tableName) + "Mapper.xml"; MyBatisMapperGenerator.generateMapperFile(tableName, columnInfos, filePath); return "MyBatis 映射文件生成成功,路径: " + filePath; } private String capitalizeFirstLetter(String str) { if (str == null || str.isEmpty()) { return str; } return Character.toUpperCase(str.charAt(0)) + str.substring(1); } } 3. 修改 DatabaseController 在 DatabaseController 中添加生成 MyBatis 映射文件的接口: java package com.example.demo.controller; import com.example.demo.entity.ColumnInfo; import com.example.demo.service.DatabaseService; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; @RestController @RequestMapping("/api/database") public class DatabaseController { @Autowired private DatabaseService databaseService; @PostMapping("/createTableFromFields") public String createTableFromFields(@RequestBody List columnInfos, @RequestParam String tableName) { return databaseService.createTableFromFields(columnInfos, tableName); } @PostMapping("/createTableFromExcel") public String createTableFromExcel(@RequestParam("file") MultipartFile file, @RequestParam String tableName) { try { Workbook workbook = new XSSFWorkbook(file.getInputStream()); return databaseService.createTableFromExcel(workbook, tableName); } catch (IOException e) { e.printStackTrace(); return "文件处理失败: " + e.getMessage(); } } @GetMapping("/generateCrudCode") public String generateCrudCode(@RequestParam String tableName) { return databaseService.generateCrudCode(tableName); } @PostMapping("/generateMyBatisMapperFile") public String generateMyBatisMapperFile(@RequestBody List columnInfos, @RequestParam String tableName) { return databaseService.generateMyBatisMapperFile(columnInfos, tableName); } } 前端部分(Vue 3) 在 DatabaseGenerator.vue 组件中添加生成 MyBatis 映射文件的按钮和方法: vue 注意事项 确保项目中有 src/main/resources/mapper 目录,用于存放生成的 MyBatis 映射文件。 生成的 MyBatis 映射文件中的 SQL 语句是简单示例,可根据实际需求进行修改和扩展。 前端代码中没有处理 Excel 文件生成映射文件的逻辑,可根据需求进一步完善。 通过以上修改,你就可以在 Web 端输入字段信息后,自动生成 MyBatis 映射文件了。