代码生成器实战 用Java+MySQL自动生成增删改查代码,告别重复劳动

Java+MySQL代码生成器实战

代码生成器实战:Java+MySQL实现CRUD自动化

核心思路

利用Java反射机制读取数据库元数据,结合模板引擎(如Freemarker/Velocity)动态生成标准化的CRUD代码。通过解析表结构自动生成实体类、DAO层、Service层和Controller层代码。

数据库连接配置
// 数据库配置示例
public class DBConfig {
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/your_db?useSSL=false";
    private static final String USER = "root";
    private static final String PASS = "password";

    public static Connection getConnection() throws Exception {
        Class.forName(DRIVER);
        return DriverManager.getConnection(URL, USER, PASS);
    }
}

元数据提取
// 获取表结构信息
public static Map<String, String> getTableMeta(String tableName) throws Exception {
    Map<String, String> columnMap = new LinkedHashMap<>();
    try (Connection conn = DBConfig.getConnection()) {
        DatabaseMetaData meta = conn.getMetaData();
        ResultSet rs = meta.getColumns(null, null, tableName, null);
        
        while (rs.next()) {
            String colName = rs.getString("COLUMN_NAME");
            String colType = rs.getString("TYPE_NAME");
            columnMap.put(colName, colType);
        }
    }
    return columnMap;
}

模板设计示例(Freemarker)
// Entity模板示例
package ${packageName}.entity;
import java.io.Serializable;
public class ${className} implements Serializable {
    <#list columns as col>
    private ${col.javaType} ${col.fieldName};
    </#list>
    
    <#list columns as col>
    public ${col.javaType} get${col.methodName}() {
        return this.${col.fieldName};
    }
    public void set${col.methodName}(${col.javaType} ${col.fieldName}) {
        this.${col.fieldName} = ${col.fieldName};
    }
    </#list>
}

类型映射处理
// JDBC类型转Java类型
public static String convertToJavaType(String dbType) {
    switch(dbType.toUpperCase()) {
        case "VARCHAR": case "CHAR": case "TEXT":
            return "String";
        case "INT": case "TINYINT": case "SMALLINT":
            return "Integer";
        case "BIGINT":
            return "Long";
        case "DATETIME": case "TIMESTAMP":
            return "Date";
        case "DECIMAL": case "NUMERIC":
            return "BigDecimal";
        default:
            return "Object";
    }
}

代码生成主流程
public void generateCRUD(String tableName) throws Exception {
    // 1. 获取表元数据
    Map<String, String> columns = getTableMeta(tableName);
    
    // 2. 准备模板数据
    Map<String, Object> data = new HashMap<>();
    data.put("className", convertToCamelCase(tableName, true));
    data.put("tableName", tableName);
    
    List<Map<String, String>> columnList = new ArrayList<>();
    columns.forEach((name, type) -> {
        Map<String, String> col = new HashMap<>();
        col.put("fieldName", convertToCamelCase(name, false));
        col.put("methodName", convertToCamelCase(name, true));
        col.put("javaType", convertToJavaType(type));
        columnList.add(col);
    });
    data.put("columns", columnList);
    
    // 3. 渲染模板
    Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
    cfg.setDirectoryForTemplateLoading(new File("templates"));
    
    // 生成Entity
    Template entityTemplate = cfg.getTemplate("entity.ftl");
    entityTemplate.process(data, new FileWriter("output/"+data.get("className")+".java"));
    
    // 生成Mapper等(类似逻辑)
}

增强功能实现

动态SQL生成

// 生成MyBatis Mapper XML
public String generateMapperXml(Map<String, String> columns, String className) {
    StringBuilder sb = new StringBuilder();
    sb.append("<insert id=\"insert\" parameterType=\"").append(className).append("\">\n");
    sb.append("    INSERT INTO ").append(tableName).append("(\n");
    
    columns.keySet().forEach(col -> sb.append("        ").append(col).append(",\n"));
    sb.deleteCharAt(sb.lastIndexOf(","));
    
    sb.append("    ) VALUES (\n");
    columns.keySet().forEach(col -> 
        sb.append("        #{").append(convertToCamelCase(col, false)).append("},\n"));
    sb.deleteCharAt(sb.lastIndexOf(","));
    
    sb.append("    )\n</insert>");
    return sb.toString();
}

扩展建议

  1. 添加Swagger注解自动生成
  2. 集成Spring Validation自动生成参数校验
  3. 支持多表关联查询代码生成
  4. 添加日志埋点自动注入
  5. 生成单元测试骨架代码
项目结构优化
code-generator/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── generator/
│   │   │           ├── core/           # 核心生成逻辑
│   │   │           ├── config/         # 数据库配置
│   │   │           ├── template/       # 模板管理
│   │   │           └── util/           # 工具类
│   │   └── resources/
│   │       └── templates/             # 模板文件
│   └── test/                          # 单元测试
├── output/                            # 生成代码输出目录
└── pom.xml

通过系统化设计,该生成器可减少约70%的重复CRUD编码工作。建议将常用模板预置为项目资源,通过配置文件控制生成选项,如是否生成Swagger注解、是否启用二级缓存等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值