
代码生成器实战: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();
}
扩展建议
- 添加Swagger注解自动生成
- 集成Spring Validation自动生成参数校验
- 支持多表关联查询代码生成
- 添加日志埋点自动注入
- 生成单元测试骨架代码
项目结构优化
code-generator/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── generator/
│ │ │ ├── core/ # 核心生成逻辑
│ │ │ ├── config/ # 数据库配置
│ │ │ ├── template/ # 模板管理
│ │ │ └── util/ # 工具类
│ │ └── resources/
│ │ └── templates/ # 模板文件
│ └── test/ # 单元测试
├── output/ # 生成代码输出目录
└── pom.xml
通过系统化设计,该生成器可减少约70%的重复CRUD编码工作。建议将常用模板预置为项目资源,通过配置文件控制生成选项,如是否生成Swagger注解、是否启用二级缓存等。
Java+MySQL代码生成器实战
4174

被折叠的 条评论
为什么被折叠?



