此类是加上了swagger的
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class GenEntityMysql {
private static final GenEntityMysql INSTANCE = new GenEntityMysql();
private String tableName;// 表名
private String[] colNames; // 列名数组
private String[] colTypes; // 列名类型数组
private String[] colComment; // 列名注释
private int[] colSizes; // 列名大小数组
private boolean needUtil = false; // 是否需要导入包java.util.*
private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final String SQL = "select column_name,column_type,column_comment from INFORMATION_SCHEMA.Columns where table_name = ";// 数据库操作
// TODO 需要修改的地方
private static final String URL = "";//数据库地址
private static final String NAME = "";
private static final String PASS = "";
private static final String DRIVER = "com.mysql.jdbc.Driver";
private String entityOutPath = "";//实体类生成所在包的路径
private String daoOutPath = ""; // 指定dao层生成所在包的路径
private String serviceOutPath = ""; // 指定service层生成所在包的路径
private String controlOutPath = ""; // 指定control层生成所在包的路径
private String resultPath = "import com.nc.result.Result;";//自行封装的结果类
// 无需修改,自动生成
private String daoClassName; // dao层类名
private String serviceClassName; // service层类型
private String controlClassName; // control层类名
private String authorName = "tcd";// 作者名字
private String[] generateTables = {""};//指定需要生成的表的表名
/**
* 类的构造方法
*/
private GenEntityMysql() {
}
/**
* @return 生成class的所有内容
* @update 2020/05/11 17:30
*/
private String parse() {
StringBuffer sb = new StringBuffer();
sb.append("package " + entityOutPath + ";\r\n");
sb.append("\r\n");
sb.append("import io.swagger.annotations.ApiModel;\r\n");
sb.append("import java.util.Date;\r\n");
sb.append("import io.swagger.annotations.ApiModelProperty;\r\n");
sb.append("import lombok.Data;\nimport lombok.NoArgsConstructor;\nimport lombok.AllArgsConstructor;\n");
// 判断是否导入工具包
if (needUtil) {
sb.append("import java.util.Date;\r\n");
}
// 注释部分
sb.append("/**\r\n");
sb.append(" *\r\n");
sb.append(" * Created by " + authorName + " on " + SDF.format(new Date()) + "\r\n");
sb.append(" */ \r\n");
// 实体部分
sb.append("@Data\n@ApiModel\n@AllArgsConstructor\n@NoArgsConstructor\n");
sb.append("public class " + getTransStr(tableName, true) + "{\r\n\r\n");
processAllAttrs(sb);// 属性
sb.append("\r\n");
// processAllMethod(sb);// get set方法
sb.append("}\r\n");
return sb.toString();
}
/**
* @return 生成dao的所有内容
* @update 2020/05/11 17:30
*/
private String daoParse() {
StringBuffer sb = new StringBuffer();
String transStr = getTransStr(tableName, true);
String transStr1 = getTransStr(tableName, false);
sb.append("package " + daoOutPath + ";\r\n");
sb.append("\r\n");
sb.append("import org.springframework.stereotype.Repository;\nimport org.apache.ibatis.annotations.*;\n");
sb.append("import " + entityOutPath + "." + transStr + ";\r\n");
sb.append("import java.util.List;\n");
sb.append("\r\n");
// 注释部分
sb.append("/**\r\n");
sb.append(" * Created by " + authorName + " on " + SDF.format(new Date()) + "\r\n");
sb.append(" */ \r\n");
sb.append("@Repository\n");
sb.append("public interface " + transStr + "Dao" + "{\r\n\r\n");
sb.append("\t//查询" + tableName + "1信息");
sb.append("\r\n");
sb.append("\t@Select(\"select * from " + tableName + "\")\n"); // select
sb.append("\tList<" + transStr + "> find" + transStr + "(" + transStr + " " + transStr1 + ");\n\n");
StringBuffer insertCol = new StringBuffer();
StringBuffer insertCol1 = new StringBuffer();
for (int i = colNames.length - 1; i > 0 ; i--) {
insertCol.append((i == colNames.length - 1 ? "" : ",") + colNames[i]);
insertCol1.append("#{" + getTransStr(colNames[i], false) + "}" + (i == colNames.length || i == 1 ? "" : ","));
}
sb.append("\t//新增" + tableName + "1信息");
sb.append("\r\n");
sb.append("\t@Insert(\"insert into " + tableName + "(" + insertCol + ") " + "values(" + insertCol1 + ")\")\n"); // insert
sb.append("\tvoid insert" + transStr + "(" + transStr + " " + transStr1 + ");\n\n");
StringBuffer updateCol = new StringBuffer();
for (int i = colNames.length - 1; i > 0 ; i--) {
updateCol.append((i == colNames.length - 1 ? "" : ",") + colNames[i] + "=#{" + getTransStr(colNames[i], false) + "}");
}
sb.append("\t//修改" + tableName + "1信息");
sb.append("\r\n");
sb.append("\t@Update(\"update " + tableName + " set " + updateCol + " where id=#{id}\")\n"); // update
sb.append("\t" + "void update" + transStr + "(" + transStr + " " + transStr1 + ");\n\n");
sb.append("\t//删除" + tableName + "1信息");
sb.append("\r\n");
sb.append("\t@Update(\"update " + tableName + " set is_del= -1 where id=#{id}\")\n"); // delete
sb.append("\tInteger delete" + transStr + "(@Param(\"id\")Integer id);\n\n");
sb.append("}");
return sb.toString();
}
/**
* @return 生成service的所有内容
* @update 2020/05/11 17:30
*/
private String serviceParse() {
StringBuffer sb = new StringBuffer();
String transStr = getTransStr(tableName, true);
String transStr1 = getTransStr(tableName, false);
sb.append("package " + serviceOutPath + ";\r\n");
sb.append("\r\n");
sb.append(resultPath + "\r\n");
sb.append("import org.springframework.stereotype.Service;\r\n");
sb.append("import " + entityOutPath + "." + transStr + ";\r\n");
sb.append("import " + daoOutPath + "." + transStr + "Dao;\r\n");
sb.append("import org.springframework.beans.factory.annotation.Autowired;\r\n");
sb.append("import javax.servlet.http.HttpServletRequest;\r\n");
sb.append("import org.springframework.transaction.annotation.Transactional;\r\n");
sb.append("import java.util.List;\r\n");
sb.append("\r\n");
// 注释部分
sb.append("/**\r\n");
sb.append(" * Created by " + authorName + " o n " + SDF.format(new Date()) + "\r\n");
sb.append(" */ \r\n");
sb.append("@Service\n");
sb.append("public class " + transStr + "Service" + " {\r\n\r\n");
sb.append("\t@Autowired\r\n\t");
sb.append(transStr + "Dao ");
sb.append(transStr1 + "Dao;\n\n");
sb.append("\t//查询" + transStr + "1信息");
sb.append("\r\n");
sb.append("\tpublic Result find" + transStr + "(" + transStr + " " + transStr1 + ") { \r\n");
sb.append("\t\t//查询" + transStr + "1集合信息\r\n");
sb.append("\t\tList<"+transStr+"> "+transStr1+"List = "+transStr1+"Dao.find"+transStr+"("+(transStr1)+");\r\n");
sb.append("\t\treturn Result.success("+transStr1+"List);\r\n");
sb.append("\t}\r\n\n");
sb.append("\t//新增" + transStr + "1信息");
sb.append("\r\n");
sb.append("\t@Transactional\n");
sb.append("\tpublic Result insert"+transStr+"("+transStr+" "+transStr1+", HttpServletRequest request) {\r\n");
sb.append("\t\tif (" + transStr1 + " == null) return Result.exception(\"参数为空,请联系管理员\");\r\n");
sb.append("\t\t" + transStr1 + "Dao.insert" + transStr + "(" + (transStr1) + ");\r\n");
sb.append("\t\treturn Result.success();\r\n");
sb.append("\t}\r\n\n");
sb.append("\t//修改" + transStr + "1信息");
sb.append("\r\n");
sb.append("\t@Transactional\n");
sb.append("\tpublic Result update");
sb.append(transStr);
sb.append("(");
sb.append(transStr);
sb.append(" ");
sb.append(transStr1);
sb.append(", HttpServletRequest request) {\r\n\t\t");
sb.append("if (");
sb.append(transStr1);
sb.append(" == null || ");
sb.append(transStr1);
sb.append(".getId() == null) return Result.exception(\"参数为空,请联系管理员\");\r\n");
sb.append("\t\t");
sb.append(transStr1);
sb.append("Dao.update");
sb.append(transStr);
sb.append("(");
sb.append(transStr1);
sb.append(");\r\n\t\treturn Result.success();\r\n");
sb.append("\t}\r\n\n");
sb.append("\t//删除" + transStr + "1信息");
sb.append("\r\n");
sb.append("\tpublic Result delete" + transStr + "(Integer id) { \r\n");
sb.append("\t\tif(1 == " + transStr1 + "Dao.delete" + transStr + "(id))\r\n");
sb.append("\t\t\treturn Result.success();\r\n");
sb.append("\t\t\treturn Result.exception(\"删除失败!\");\r\n");
sb.append("\t}\r\n");
sb.append("}");
return sb.toString();
}
public String controllerParse() {
StringBuffer sb = new StringBuffer();
String transStr = getTransStr(tableName, true);
String transStr1 = getTransStr(tableName, false);
sb.append("package " + controlOutPath + ";\r\n");
sb.append("\r\n");
sb.append("import io.swagger.annotations.ApiOperation;\r\n");
sb.append("import " + serviceOutPath + "." + transStr + "Service;\r\n");
sb.append("import " + entityOutPath + "." + transStr + ";\r\n");
// sb.append(webLogPath + "\r\n");
sb.append(resultPath + "\r\n");
sb.append("import org.springframework.web.bind.annotation.PostMapping;\r\n");
sb.append("import org.springframework.web.bind.annotation.RequestMapping;\r\n");
sb.append("import org.springframework.web.bind.annotation.RestController;\r\n");
sb.append("import org.springframework.beans.factory.annotation.Autowired;\r\n");
sb.append("import io.swagger.annotations.Api;\r\n");
sb.append("import io.swagger.annotations.ApiImplicitParam;\r\n");
sb.append("import io.swagger.annotations.ApiImplicitParams;\r\n");
sb.append("import org.springframework.web.bind.annotation.*;\r\n");
sb.append("import javax.servlet.http.HttpServletRequest;\r\n");
sb.append("/**\r\n");
sb.append(" * Created by " + authorName + " on " + SDF.format(new Date()) + "\r\n");
sb.append(" */ \r\n");
sb.append("@Slf4j\r\n");
sb.append("@RestController\r\n");
sb.append("@RequestMapping(\"/" + transStr1 + "\")\r\n");
sb.append("@Api(tags = {\"\"})\r\n");
sb.append("public class " + transStr + "Controller {\r\n");
sb.append("\t@Autowired\r\n");
sb.append("\t" + transStr + "Service " + transStr1 + "Service;\r\n\r\n");
sb.append("\t@GetMapping(\"/find" + transStr + "\")\r\n");
sb.append("\t@ApiOperation(value = \"查询" + transStr + "1信息\")\r\n");
sb.append("\tpublic Result<" + transStr + "> find" + transStr + "(" + transStr + " " + transStr1 + ") {\r\n\t\t");
sb.append("return " + transStr1 + "Service.find" + transStr + "(" + transStr1 + ");\r\n");
sb.append("\t}\r\n\r\n");
sb.append("\t@PostMapping(\"/insert"+transStr+"\")\r\n");
sb.append("\t@ApiOperation(value = \"新增" + transStr + "1信息\")\r\n");
// sb.append("\t@WebLog(description = \"\")\r\n");
sb.append("\tpublic Result<" + transStr + "> insert"+transStr+"(@RequestBody "+transStr+" "+transStr1 +", HttpServletRequest request) {\r\n\t\t");
sb.append("return "+transStr1+"Service.insert"+transStr+"("+transStr1+",request);\r\n");
sb.append("\t}\r\n\r\n");
sb.append("\t@PostMapping(\"/update"+transStr+"\")\r\n");
sb.append("\t@ApiOperation(value = \"修改" + transStr + "1\")\n");
// sb.append("\t@WebLog(description = \"\")\r\n");
sb.append("\tpublic Result<" + transStr + "> update"+transStr+"(@RequestBody "+transStr+" "+transStr1 +", HttpServletRequest request) {\r\n\t\t");
sb.append("return "+transStr1+"Service.update"+transStr+"("+transStr1+",request);\r\n");
sb.append("\t}\r\n\r\n");
sb.append("\t@PostMapping(\"/delete"+transStr+"\")\r\n");
sb.append("\t@ApiOperation(value = \"删除" + transStr + "1信息\")\r\n");
// sb.append("\t@WebLog(description = \"\")\r\n");
sb.append("\tpublic Result delete"+transStr+"(Integer id) {\r\n");
sb.append("\t\treturn "+transStr1+"Service.delete"+transStr+"(id);\r\n");
sb.append("\t}\r\n\r\n");
sb.append("}");
return sb.toString();
}
/**
* @param sb
* @description 生成所有成员变量
* @author paul
* @date 2017年8月18日 下午5:15:04
* @update 2017年8月18日 下午5:15:04
* @version V1.0
*/
private void processAllAttrs(StringBuffer sb) {
int j = 0;
for (int i = colNames.length - 1; i >= 0; i--) {
j++;
sb.append("\t@ApiModelProperty(name = \"" + getTransStr(colNames[i], false) + "\", value = \"" + colComment[i] + "\", dataType = \"" + sqlType2JavaType(colTypes[i]) + "\", position = " + j + ")\n");
sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + getTransStr(colNames[i], false) + ";\r\n");
}
}
/**
* @param sb
* @description 生成所有get/set方法
* @author paul
* @date 2017年8月18日 下午5:14:47
* @update 2017年8月18日 下午5:14:47
* @version V1.0
*/
private void processAllMethod(StringBuffer sb) {
for (int i = 0; i < colNames.length; i++) {
sb.append("\tpublic void set" + getTransStr(colNames[i], true) + "(" + sqlType2JavaType(colTypes[i]) + " "
+ getTransStr(colNames[i], false) + "){\r\n");
sb.append("\t\tthis." + getTransStr(colNames[i], false) + "=" + getTransStr(colNames[i], false) + ";\r\n");
sb.append("\t}\r\n");
sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + getTransStr(colNames[i], true) + "(){\r\n");
sb.append("\t\treturn " + getTransStr(colNames[i], false) + ";\r\n");
sb.append("\t}\r\n");
}
}
/**
* @param str 传入字符串
* @return
* @description 将传入字符串的首字母转成大写
* @author paul
* @date 2017年8月18日 下午5:12:12
* @update 2017年8月18日 下午5:12:12
* @version V1.0
*/
private String initCap(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z')
ch[0] = (char) (ch[0] - 32);
return new String(ch);
}
/**
* @return
* @description 将mysql中表名和字段名转换成驼峰形式
* @author paul
* @date 2017年8月18日 下午4:55:07
* @update 2017年8月18日 下午4:55:07
* @version V1.0
*/
private String getTransStr(String before, boolean firstChar2Upper) {
//不带"_"的字符串,则直接首字母大写后返回
if (!before.contains("_"))
// 为false 首字母不转为大写
return firstChar2Upper ? initCap(before) : before;
String[] strs = before.split("_");
StringBuffer after = null;
if (firstChar2Upper) {
after = new StringBuffer(initCap(strs[0]));
} else {
// 为false 表示首字母不转为大写
after = new StringBuffer(strs[0]);
}
if (strs.length > 1) {
for (int i = 1; i < strs.length; i++)
after.append(initCap(strs[i]));
}
return after.toString();
}
/**
* @return
* @description 查找sql字段类型所对应的Java类型
* @author paul
* @date 2017年8月18日 下午4:55:41
* @update 2017年8月18日 下午4:55:41
* @version V1.0
*/
private String sqlType2JavaType(String sqlType) {
if (sqlType.equalsIgnoreCase("bit")) {
return "boolean";
} else if (sqlType.equalsIgnoreCase("tinyint")) {
return "byte";
} else if (sqlType.equalsIgnoreCase("smallint")) {
return "short";
} else if (sqlType.equalsIgnoreCase("int")) {
return "Integer";
} else if (sqlType.equalsIgnoreCase("bigint")) {
return "long";
} else if (sqlType.equalsIgnoreCase("float")) {
return "float";
} else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric")
|| sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money")
|| sqlType.equalsIgnoreCase("smallmoney")) {
return "double";
} else if (sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char")
|| sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar")
|| sqlType.equalsIgnoreCase("text")
) {
return "String";
} else if (sqlType.equalsIgnoreCase("datetime")|| sqlType.equalsIgnoreCase("date")
|| sqlType.equalsIgnoreCase("timestamp")) {
return "Date";
} else if (sqlType.equalsIgnoreCase("image")) {
return "Blod";
}
return null;
}
/**
* 生成方法
*
* @throws Exception
*/
private void create() throws Exception {
//与数据库的连接
Connection con;
PreparedStatement pStemt = null;
Class.forName(DRIVER);
con = DriverManager.getConnection(URL, NAME, PASS);
System.out.println("连接数据库成功");
//获取数据库的元数据
// DatabaseMetaData db = con.getMetaData();
//是否有指定生成表,有指定则直接用指定表,没有则全表生成
List<String> tableNames = new ArrayList<>();
if (generateTables == null) {
//从元数据中获取到所有的表名
/* ResultSet rs = db.getTables(null, null, null, new String[]{"TABLE"});
while (rs.next()) tableNames.add(rs.getString(3));*/
throw new RuntimeException("表名不能为空");
} else {
for (String tableName : generateTables) tableNames.add(tableName);
}
// String tableSql;
PrintWriter pw = null;
for (int j = 0; j < tableNames.size(); j++) {
// 获取表名
tableName = tableNames.get(j);
// tableSql = SQL + tableName;
pStemt = con.prepareStatement("select column_name,data_type,column_comment from INFORMATION_SCHEMA.Columns where table_name=? order by ordinal_position");
pStemt.setString(1, tableName);
ResultSet rs = pStemt.executeQuery();
rs.last();
int size = rs.getRow();
colNames = new String[size];
colTypes = new String[size];
colComment = new String[size];
rs.beforeFirst();
for (int i = size - 1; i >= 0; i--) {
rs.next();
colNames[i] = rs.getString("column_name");
colTypes[i] = rs.getString("data_type");
colComment[i] = rs.getString("column_comment");
}
// 有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。
/* ResultSetMetaData rsmd = pStemt.getMetaData();
ParameterMetaData parameterMetaData = pStemt.getParameterMetaData();
ResultSet generatedKeys = pStemt.getGeneratedKeys();*/
// 获取表字段数量
/* int size = rsmd.getColumnCount();
colNames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
//获取所需的信息
for (int i = 0; i < size; i++) {
// 获取列名称
colNames[i] = rsmd.getColumnName(i + 1);
// 获取列类型
colTypes[i] = rsmd.getColumnTypeName(i + 1);
if (colTypes[i].equalsIgnoreCase("datetime")) // 如果为date类型 导入jar包
needUtil = true;
// 获取长度
colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
}*/
//解析生成class的所有内容
String content = parse();
String dao = daoParse();
String service = serviceParse();
String controller = controllerParse();
//输出生成文件
File directory = new File("");
//directory.getAbsolutePath() 当前项目位置
String dirName = directory.getAbsolutePath() + "/src/main/java/";
File dir = new File(dirName);
// File.exists() 判断文件是否存在, 存在返回true
// File f1 = new File("E://aaa//bbb");
// f1.mkdirs(); 生成所有目录
// f1.mkdir(); 必须AAA目录存在才能生成BBB目录
if (!dir.exists() && dir.mkdirs()) System.out.println("generate dir 【" + dirName + "】");
String javaPath = dirName + entityOutPath.replace(".", "/") + "/" + getTransStr(tableName, true) + ".java";
String daoPath = dirName + daoOutPath.replace(".", "/") + "/" + getTransStr(tableName, true) + "Dao" + ".java";
String servicePath = dirName + serviceOutPath.replace(".", "/") + "/" + getTransStr(tableName, true) + "Service" + ".java";
String controllerPath = dirName + controlOutPath.replace(".", "/") + "/" + getTransStr(tableName, true) + "Controller" + ".java";
FileWriter fw = new FileWriter(daoPath);
pw = new PrintWriter(fw);
pw.println(dao);
pw.flush();
fw = new FileWriter(servicePath);
pw = new PrintWriter(fw);
pw.println(service);
pw.flush();
fw = new FileWriter(controllerPath);
pw = new PrintWriter(fw);
pw.println(controller);
pw.flush();
// FileWriter fw = new FileWriter(javaPath);
fw = new FileWriter(javaPath);
pw = new PrintWriter(fw);
pw.println(content);
pw.flush();
System.out.println("create class 【" + tableName + "】");
}
if (pw != null)
pw.close();
}
/**
* @param args
* @description 执行方法
* @author paul
* @date 2017年8月18日 下午2:03:35
* @update 2017年8月18日 下午2:03:35
* @version V1.0
*/
public static void main(String[] args) {
try {
INSTANCE.create();
System.out.println("generate classes success!");
} catch (Exception e) {
e.printStackTrace();
}
}
}