本代码是基于java grpc协议文件代码 mybatis数据库操作代码 swagger文档生成代码 目的在于减少重复性代码 减少犯错(本人数据库经常写错要测试同事测试几遍才能通过) 然后有一天聊天聊到这里能不能基于公司项目生成一些代码模板 故花了一天时间写了出来,前端代码我不会写是同事帮忙写的 故没有贴出来附上截图 供学习和记录自己学习用
定义数据类型
public interface TypeClass {
/**
*
*/
String LONG = "Long";
/**
*
*/
String INTEGER = "Integer";
/**
*
*/
String SHORT = "Short";
/**
*
*/
String STRING = "String";
/**
* 日期
*/
String DATE = "Date";
}
生成以下文件代码
数据库实体类
数据库表语句
Mapper接口
Mapper.xml
Grpc.proto
Swagger
import org.assertj.core.util.Lists;
import org.junit.Test;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MapperTest {
@Test
public void test1() {
String className = "TestModel";
String tableName = xX2x_x(className);
String line = "id,Long,ID";
String line2 = "name,String,名称";
String line3 = "value,Short,数额值";
String line4 = "createTime,Date,创建日期";
String line5 = "updateTime,Date,修改日期";
List<String> lines = Lists.newArrayList(line, line2, line3, line4, line5);
String modelStr = testCreateModel(lines, className, tableName);
System.out.println(modelStr);
String tableStr = testCreateTable(lines, className, tableName);
System.out.println(tableStr);
String mapperStr = testCreateMapper(lines, className, tableName);
System.out.println(mapperStr);
String xmlStr = testCreateXML(lines, className, tableName);
System.out.println(xmlStr);
String protoStr = testCreateProto(lines, className, tableName);
System.out.println(protoStr);
String swaggerStr = testCreateSwagger(lines, className, tableName);
System.out.println(swaggerStr);
}
public String testCreateModel(List<String> lines, String className, String tableName) {
StringBuilder builder = new StringBuilder();
boolean hasDate = false;
for (String tr : lines) {
String[] array = tr.split(",");
String key = array[0];
String type = array[1];
String desc = array[2];
if (type.equals("Date")) {
hasDate = true;
break;
}
}
if (hasDate) {
String startImport = "import java.util.Date;\n";
String import1 = "import com.fasterxml.jackson.databind.PropertyNamingStrategies;\n" +
"import com.fasterxml.jackson.databind.annotation.JsonNaming;\n" +
"import lombok.*;\n";
String autowire = "@Setter\n" +
"@Getter\n" +
"@NoArgsConstructor\n" +
"@AllArgsConstructor\n" +
"@Builder\n" +
"@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)\n";
builder.append(startImport + import1 + autowire);
} else {
String import1 = "import com.fasterxml.jackson.databind.PropertyNamingStrategies;\n" +
"import com.fasterxml.jackson.databind.annotation.JsonNaming;\n" +
"import lombok.*;\n";
String autowire = "@Setter\n" +
"@Getter\n" +
"@NoArgsConstructor\n" +
"@AllArgsConstructor\n" +
"@Builder\n" +
"@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)\n";
builder.append(import1 + autowire);
}
// 生成model
String startClass = "public class " + className + "{\n";
builder.append(startClass);
String tableKey = "\t";
for (String tr : lines) {
String[] array = tr.split(",");
String key = array[0];
String type = array[1];
String desc = array[2];
String str1 = "/**\n*" + desc + "\n**/\n";
String str2 = "private " + type + " " + key + ";\n";
builder.append(str1 + str2);
}
String endClass = "}";
builder.append(endClass);
return builder.toString();
}
public String testCreateTable(List<String> lines, String className, String tableName) {
StringBuilder builder = new StringBuilder();
// 生成表
String startTable = "CREATE TABLE " + parseTableKey(tableName) + "(";
builder.append(startTable);
String tableKey = "\t";
for (String tr : lines) {
String[] array = tr.split(",");
String key = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
String keyValue = parseTableKey(key) + " ";
String typeStr = "";
switch (type) {
// 日期
case TypeClass.DATE:
if (key.equals("create_time")) {
typeStr = " datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ";
} else if (key.equals("update_time")) {
typeStr = " datetime NOT NULL DEFAULT '1001-01-01 00:00:00' ON UPDATE CURRENT_TIMESTAMP ";
} else {
typeStr = " datetime NOT NULL DEFAULT '1001-01-01 00:00:00' ";
}
break;
case TypeClass.LONG:
if (key.equals("id")) {
typeStr = " bigint(20) NOT NULL AUTO_INCREMENT ";
} else {
typeStr = " bigint(20) NOT NULL DEFAULT '0' ";
}
break;
case TypeClass.INTEGER:
typeStr = " int(11) NOT NULL DEFAULT '0' ";
break;
case TypeClass.SHORT:
typeStr = " tinyint(4) NOT NULL DEFAULT '0' ";
break;
case TypeClass.STRING:
typeStr = " varchar(64) NOT NULL DEFAULT '' ";
break;
}
String finalValue = keyValue + typeStr + "COMMENT '" + desc + "',\n";
builder.append(finalValue);
}
String endTable = "PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT=''";
builder.append(endTable);
return builder.toString();
}
public String testCreateMapper(List<String> lines, String className, String tableName) {
StringBuilder builder = new StringBuilder();
String startImport = "import org.apache.ibatis.annotations.Mapper;\n" +
"import org.apache.ibatis.annotations.Param;\n" +
"import java.util.List;\n" +
"import java.util.Set;\n";
builder.append(startImport);
String startClass = "@Mapper\n" +
"public interface " + className + "Mapper {\n";
builder.append(startClass);
// get 方法
String getMethod = className + " getById(@Param(\"id\") long id);\n";
builder.append(getMethod);
// find 方法
String findMethod = "List<" + className + "> find(@Param(\"status\") Set<Short> status,\n" +
" @Param(\"sort_by\") String sortBy,\n" +
" @Param(\"sort_direction\") String sortDirection,\n" +
" @Param(\"page_start\") Integer pageStart,\n" +
" @Param(\"page_size\") Integer pageSize);\n";
builder.append(findMethod);
// insert 方法
String insertMethod = "int insert(" + className + " obj);\n";
builder.append(insertMethod);
// update 方法
String updateMethod = "int update(" + className + " obj);\n";
builder.append(updateMethod);
String endClass = "}";
builder.append(endClass);
return builder.toString();
}
public String testCreateXML(List<String> lines, String className, String tableName) {
StringBuilder builder = new StringBuilder();
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n" +
" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n";
String mapperHeader = "<mapper namespace=\"" + className + "Mapper\">\n";
String baseColumnList = "";
String baseColumnStart = "<sql id=\"baseColumnList\">\n";
StringBuilder baseColumnContentBuilder = new StringBuilder();
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
if (i == lines.size() - 1) {
baseColumnContentBuilder.append(parseTableKey(key) + "\n");
} else {
baseColumnContentBuilder.append(parseTableKey(key) + ",");
}
}
builder.append(header);
builder.append(mapperHeader);
String baseColumnEnd = "</sql>\n";
baseColumnList = baseColumnStart + baseColumnContentBuilder.toString() + baseColumnEnd;
String mapperTail = "</mapper>\n";
builder.append(baseColumnList);
// getById 方法
String getMethod = " <select id=\"getById\" resultType=\"" + className + "\">\n" +
" SELECT <include refid=\"baseColumnList\"/>\n" +
" FROM " + parseTableKey(tableName) +
"\n <where>\n" +
" id = #{id}" +
"\n </where>\n" +
" LIMIT 1\n" +
" </select>\n";
builder.append(getMethod);
// find 方法
String findMthod = "<select id=\"find\" resultType=\"" + className + "\">\n" +
" SELECT <include refid=\"baseColumnList\"/>\n" +
" FROM " + parseTableKey(tableName) + "\n" +
"\t\t<where>\n" +
" <if test=\"id != null\">\n" +
" AND `id` = #{id}\n" +
" </if>\n" +
" <if test=\"status != null and status.size() > 0\">\n" +
" AND `status` IN\n" +
" <foreach collection=\"status\" item=\"item\" index=\"index\" open=\"(\" close=\")\" separator=\",\">\n" +
" #{item}\n" +
" </foreach>\n" +
" </if>\n" +
" <if test=\"keywords != null and keywords != ''\">\n" +
" AND CONCAT(`key1`, `key2`) like CONCAT('%', #{keywords}, '%')\n" +
" </if>\n" +
" </where>\n" +
" <if test=\"sort_by != null and sort_direction != null\">\n" +
" ORDER BY `${sort_by}` ${sort_direction}\n" +
" </if>\n" +
" <if test=\"sort_by == null or sort_direction == null\">\n" +
" ORDER BY `id` DESC\n" +
" </if>\n" +
" <if test=\"page_start != null and page_size != null\">\n" +
" LIMIT #{page_start}, #{page_size}\n" +
" </if>\n" +
" </select>\n";
builder.append(findMthod);
// insert 方法
String insertMethod = "<insert id=\"insert\" parameterType=\"" + className + "\"\n" +
" useGeneratedKeys=\"true\" keyProperty=\"id\" keyColumn=\"id\">\n" +
" INSERT INTO " + parseTableKey(tableName) + "\n\t\t<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n";
StringBuilder builderKey = new StringBuilder();
StringBuilder builderValue = new StringBuilder();
builderValue.append("\t\t<trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n");
for (String str : lines) {
String[] array = str.split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
if (key.equals("id") || key.equals("createTime") || key.equals("updateTime")) {
continue;
}
builderKey.append("\t\t\t<if test=\"" + key + " != null\">\n");
builderKey.append("\t\t\t\t" + parseTableKey(keyDb) + ",\n" +
"\t\t\t</if>\n");
builderValue.append("\t\t\t<if test=\"" + key + " != null\">\n");
builderValue.append("\t\t\t\t#{" + key + "},\n" +
"\t\t\t</if>\n");
}
builderKey.append("\t\t</trim>\n");
builderValue.append("\t\t</trim>\n");
insertMethod = insertMethod + builderKey + builderValue + "\t</insert>\n";
builder.append(insertMethod);
// update 方法
StringBuilder builderUpdate = new StringBuilder("\t<update id=\"update\">\n" +
"\t\tUPDATE " + parseTableKey(tableName) + "\n\t\t<set>\n");
for (String str : lines) {
String[] array = str.split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
if (key.equals("id") || key.equals("createTime") || key.equals("updateTime")) {
continue;
}
builderUpdate.append("\t\t\t<if test=\"" + key + " != null\">\n" +
"\t\t\t\t");
builderUpdate.append(parseTableKey(keyDb) + " = #{" + key + "},\n" +
"\t\t\t</if>\n");
}
builderUpdate.append("\t\t</set>\n" +
"\t\t<where>\n" +
"\t\t\t`id` = #{id}\n" +
"\t\t</where>\n" +
"\t</update>\n");
builder.append(builderUpdate);
builder.append(mapperTail);
return builder.toString();
}
public String testCreateProto(List<String> lines, String className, String tableName) {
StringBuilder builder = new StringBuilder();
// service
StringBuilder serviceBuilder = new StringBuilder("service " + className + "Service {");
// create
serviceBuilder.append("\n" +
" // create说明\n" +
" //\n" +
" // 1001 操作成功\n" +
" // 1002 暂无记录\n" +
" // 1500 操作失败, 参考`message`\n");
serviceBuilder.append(" rpc create (" + className + "CreateRequest) returns (" + className + "CreateReply) {};\n");
// update
serviceBuilder.append("\n" +
" // update说明\n" +
" //\n" +
" // 1001 操作成功\n" +
" // 1002 暂无记录\n" +
" // 1500 操作失败, 参考`message`\n");
serviceBuilder.append(" rpc update (" + className + "UpdateRequest) returns (" + className + "UpdateReply) {};\n");
// detail
serviceBuilder.append("\n" +
" // detail说明\n" +
" //\n" +
" // 1001 操作成功\n" +
" // 1002 暂无记录\n" +
" // 1500 操作失败, 参考`message`\n");
serviceBuilder.append(" rpc detail (" + className + "DetailRequest) returns (" + className + "DetailReply) {};\n");
// detail
serviceBuilder.append("\n" +
" // list说明\n" +
" //\n" +
" // 1001 操作成功\n" +
" // 1002 暂无记录\n" +
" // 1500 操作失败, 参考`message`\n");
serviceBuilder.append(" rpc list (" + className + "ListRequest) returns (" + className + "ListReply) {};\n");
serviceBuilder.append("}\n");
builder.append(serviceBuilder.toString());
// request create update detail list
// create request
StringBuilder createRequestBuilder = new StringBuilder("message " + className + "CreateRequest {\n");
createRequestBuilder.append(" // Generic Header\n" +
" v1.header.RequestHeader header = 1;\n\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
if (key.equals("id") || key.equals("createTime") || key.equals("updateTime")) {
continue;
}
String typeStr = getProtoType(type);
createRequestBuilder.append(" // " + desc + "\n");
if (key.equals(keyDb)) {
createRequestBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " ;\n");
} else {
createRequestBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " [json_name = \"" + keyDb + "\"]" + ";\n");
}
}
createRequestBuilder.append("}\n");
builder.append(createRequestBuilder.toString());
// create reply
StringBuilder createReplyBuilder = new StringBuilder("message " + className + "CreateReply {\n");
createReplyBuilder.append(" // Generic Header\n" +
" v1.header.ReplyHeader header = 1;\n");
createReplyBuilder.append("}\n");
builder.append(createReplyBuilder.toString());
// update request
StringBuilder updateRequestBuilder = new StringBuilder("message " + className + "UpdateRequest {\n");
updateRequestBuilder.append(" // Generic Header\n" +
" v1.header.RequestHeader header = 1;\n\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
if (key.equals("createTime") || key.equals("updateTime")) {
continue;
}
String typeStr = getProtoType(type);
updateRequestBuilder.append(" // " + desc + "\n");
if (key.equals(keyDb)) {
updateRequestBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " ;\n");
} else {
updateRequestBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " [json_name = \"" + keyDb + "\"]" + ";\n");
}
}
updateRequestBuilder.append("}\n");
builder.append(updateRequestBuilder.toString());
// update reply
StringBuilder updateReplyBuilder = new StringBuilder("message " + className + "UpdateReply {\n");
updateReplyBuilder.append(" // Generic Header\n" +
" v1.header.ReplyHeader header = 1;\n");
updateReplyBuilder.append("}\n");
builder.append(updateReplyBuilder.toString());
// detail request
StringBuilder detailRequestBuilder = new StringBuilder("message " + className + "DetailRequest {\n");
detailRequestBuilder.append(" // Generic Header\n" +
" v1.header.RequestHeader header = 1;\n" +
"\n" +
" // ID\n" +
" int64 id = 2;\n" +
"\n");
detailRequestBuilder.append("}\n");
builder.append(detailRequestBuilder.toString());
// detail reply
StringBuilder detailReplyBuilder = new StringBuilder("message " + className + "DetailReply {\n");
detailReplyBuilder.append(" // Generic Header\n" +
" v1.header.ReplyHeader header = 1;\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
String typeStr = getProtoType(type);
detailReplyBuilder.append(" // " + desc + "\n");
if (key.equals(keyDb)) {
detailReplyBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " ;\n");
} else {
detailReplyBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " [json_name = \"" + keyDb + "\"]" + ";\n");
}
}
detailReplyBuilder.append("}\n");
builder.append(detailReplyBuilder.toString());
// list request
StringBuilder listRequestBuilder = new StringBuilder("message " + className + "ListRequest {\n");
listRequestBuilder.append(" // Generic Header\n" +
" v1.header.RequestHeader header = 1;\n" +
" // paging request header\n" +
" v1.header.PagingRequestHeader pagingHeader = 2 [json_name = \"paging_header\"];\n");
listRequestBuilder.append("}\n");
builder.append(listRequestBuilder.toString());
// list reply
StringBuilder listReplyBuilder = new StringBuilder("message " + className + "ListReply {\n");
listReplyBuilder.append(" // Generic Header\n" +
" v1.header.ReplyHeader header = 1;\n" +
" // paging reply header\n" +
" v1.header.PagingReplyHeader pagingHeader = 2 [json_name = \"paging_header\"];\n");
listReplyBuilder.append(" // 软件集合\n" +
" repeated " + " " + className + " row = 3;\n");
listReplyBuilder.append("}\n");
builder.append(listReplyBuilder.toString());
// reply create update detail list
// entity
StringBuilder entityBuilder = new StringBuilder("message " + className + " {\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
String typeStr = getProtoType(type);
entityBuilder.append(" // " + desc + "\n");
if (key.equals(keyDb)) {
entityBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " ;\n");
} else {
entityBuilder.append(" " + typeStr + " " + key + " = " + (i + 2) + " [json_name = \"" + keyDb + "\"]" + ";\n");
}
}
entityBuilder.append("}\n");
builder.append(listReplyBuilder.toString());
return builder.toString();
}
public String testCreateSwagger(List<String> lines, String className, String tableName) {
StringBuilder builder = new StringBuilder();
// create
StringBuilder createRequestBuilder = new StringBuilder(" @RequestParameters(value = {\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
if (key.equals("id") || key.equals("createTime") || key.equals("updateTime")) {
continue;
}
createRequestBuilder.append(" @RequestParameter(name = \"" + keyDb + "\", description = \"" + desc + "\", example = \"\", required = true),\n");
}
createRequestBuilder.append(" })\n");
builder.append(createRequestBuilder);
StringBuilder updateRequestBuilder = new StringBuilder(" @RequestParameters(value = {\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
if (key.equals("createTime") || key.equals("updateTime")) {
continue;
}
updateRequestBuilder.append(" @RequestParameter(name = \"" + keyDb + "\", description = \"" + desc + "\", example = \"\", required = true),\n");
}
updateRequestBuilder.append(" })\n");
builder.append(updateRequestBuilder);
StringBuilder detailRequestBuilder = new StringBuilder(" @RequestParameters(value = {\n" +
" @RequestParameter(name = \"id\", description = \"ID\", example = \"10086\", required = true)\n" +
" })\n");
detailRequestBuilder.append(" @ResponseParameters({\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
detailRequestBuilder.append(" @ResponseParameter(name = \"" + keyDb + "\", description = \"" + desc + "\", example = \"\", required = true),\n");
}
detailRequestBuilder.append(" })\n");
builder.append(detailRequestBuilder);
StringBuilder listRequestBuilder = new StringBuilder(" @RequestParameters(value = {\n" +
" @RequestParameter(name = \"id\", description = \"ID\", example = \"10086\", required = true)\n" +
" })\n");
listRequestBuilder.append(" @ResponseParameters({\n" +
" @ResponseParameter(name = \"row\", description = \"数据集合\", properties = {\n");
for (int i = 0; i < lines.size(); i++) {
String[] array = lines.get(i).split(",");
String key = array[0];
String keyDb = xX2x_x(array[0]);
String type = array[1];
String desc = array[2];
listRequestBuilder.append(" @ParameterProperty(name = \"" + keyDb + "\", description = \"" + desc + "\", example = \"\", required = true),\n");
}
listRequestBuilder.append(" }),\n" +
" })");
builder.append(listRequestBuilder);
return builder.toString();
}
private String parseTableKey(String value) {
return "`" + value + "`";
}
/**
* @param str
* @return java.lang.String
* @author Howe
* @Description 将驼峰转为下划线
* @Date 2022/4/22 13:11
* @since 1.0.0
*/
public String xX2x_x(String str) {
Pattern compile = Pattern.compile("[A-Z]");
Matcher matcher = compile.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
public String getProtoType(String type) {
String typeStr = "";
switch (type) {
// 日期
case TypeClass.DATE:
typeStr = "google.protobuf.Timestamp";
break;
case TypeClass.LONG:
typeStr = "int64";
break;
case TypeClass.INTEGER:
typeStr = "int32";
break;
case TypeClass.SHORT:
typeStr = "int32";
break;
case TypeClass.STRING:
typeStr = "string";
break;
}
return typeStr;
}
}
下面是前端使用效果