前言
写博客是为了记录和分享自己的学习,所分享内容是网上的资源,由于非原创项目,主要分享学习思路,只展示贴图部分代码(本人不分享本项目源码,支持项目付费)
一、生成导入语句以及包声明
File folder = new File(Constants.PATH_PO);
if(!folder.exists()){
folder.mkdirs();
}
File file = new File(folder,tableInfo.getBeanName()+".java");
OutputStream out=null;
OutputStreamWriter writer=null;
BufferedWriter bw=null;
try {
out=new FileOutputStream(file);
writer=new OutputStreamWriter(out,"UTF-8");
bw=new BufferedWriter(writer);
bw.write("package "+Constants.PACKAGE_PO+";");
bw.newLine();
bw.newLine();
bw.write("import java.io.Serializable;");
bw.newLine();
if(tableInfo.getHaveBigDecimal()){
bw.write("import java.math.BigDecimal;");
bw.newLine();
}
if(tableInfo.getHaveDate()||tableInfo.getHaveDateTime()){
bw.write("import java.util.Date;");
bw.newLine();
bw.write(Constants.BEAN_DATE_FORMAT_CLASS+";");
bw.newLine();
bw.write(Constants.BEAN_DATE_UNFORMAT_CLASS+";");
bw.newLine();
bw.write("import "+Constants.PACKAGE_ENUM+".DateTimePatternEnum;");
bw.newLine();
bw.write("import "+Constants.PACKAGE_UTILS+".DateUtils;");
bw.newLine();
}
Boolean haveIgnoreBean=false;
for(FieldInfo fieldInfo:tableInfo.getFieldIofoList()){
if(ArrayUtils.contains(Constants.IGNORE_BEAN_TOJSON_FILED.split(","),fieldInfo.getPropertyName())){
haveIgnoreBean=true;
break;
}
}
if(haveIgnoreBean){
// bw.write("import com.fasterxml.jackson.annotation.JsonFormat;");
bw.write(Constants.IGNORE_BEAN_TOJSON_CLASS+";");
bw.newLine();
}
}
这段 Java 代码的主要功能是创建一个文件并向其中写入 Java 类的内容。它根据一些条件判断是否需要导入特定的类,并最终将这些类的导入语句以及包声明等写入到文件中
1.创建文件夹和文件:
- File folder = new File(Constants.PATH_PO); 创建一个表示特定路径的File对象。
- if(!folder.exists()){ folder.mkdirs(); } 如果文件夹不存在,则创建该文件夹。
- File file = new File(folder, tableInfo.getBeanName() + ".java"); 创建一个表示特定文件名的File对象,该文件名由表信息中的 bean 名称和.java后缀组成。
2.创建输出流相关对象:
- OutputStream out = null; OutputStreamWriter writer = null; BufferedWriter bw = null; - 声明输出流、输出流写入器和缓冲写入器对象。
- 通过一系列嵌套的构造函数初始化这些对象,以便将内容写入文件,并指定编码为UTF-8。
3.写入包声明和导入语句:
- bw.write("package " + Constants.PACKAGE_PO + ";"); 写入包声明。 根据不同的条件写入导入语句:
- 如果表信息中表示有BigDecimal类型的数据,则写入import java.math.BigDecimal;。
- 如果表信息中表示有日期相关类型的数据,则写入多个与日期相关的导入语句,包括java.util.Date、自定义的日期格式化和反格式化类以及日期工具类等。
- 如果表信息中的字段列表中有需要忽略在 JSON 序列化中的字段,则根据情况写入特定的导入语句。
二、生成 Java 类的主体内容
BuildComment.createClassComment(bw, tableInfo.getComment());
bw.write("public class "+tableInfo.getBeanName()+" implements Serializable {");
bw.newLine();
//生成基本字段和注解
for(FieldInfo fieldInfo:tableInfo.getFieldIofoList()){
BuildComment.createFieldComment(bw, fieldInfo.getComment());
if(ArrayUtils.contains(Constants.SQL_DATE_TIME_TYPES,fieldInfo.getSqlType())){
bw.write("\t"+String.format(Constants.BEAN_DATE_FORMAT_EXPRESSION, DateUtils.YYYY_MM_DD_HH_MM_SS));
bw.newLine();
bw.write("\t"+String.format(Constants.BEAN_DATE_UNFORMAT_EXPRESSION, DateUtils.YYYY_MM_DD_HH_MM_SS));
bw.newLine();
}
if(ArrayUtils.contains(Constants.SQL_DATE_TYPE,fieldInfo.getSqlType())){
bw.write("\t"+String.format(Constants.BEAN_DATE_FORMAT_EXPRESSION, DateUtils.YYYY_MM_DD));
bw.newLine();
bw.write("\t"+String.format(Constants.BEAN_DATE_UNFORMAT_EXPRESSION, DateUtils.YYYY_MM_DD));
bw.newLine();
}
if(ArrayUtils.contains(Constants.IGNORE_BEAN_TOJSON_FILED.split(","),fieldInfo.getPropertyName())){
bw.write("\t"+String.format(Constants.IGNORE_BEAN_TOJSON_EXPRESSION,DateUtils.YYYY_MM_DD));
bw.newLine();
}
bw.write("\tprivate "+fieldInfo.getJavaType()+" "+fieldInfo.getPropertyName()+";");
bw.newLine();
}
这段 Java 代码的主要功能是生成一个 Java 类的主体内容,包括类的注释、类的声明以及类中的字段声明。根据不同的字段类型,还会生成特定的格式化和反格式化表达式,以及处理需要在 JSON 序列化中被忽略的字段
1.生成类注释和类声明:
- BuildComment.createClassComment(bw, tableInfo.getComment()); 调用一个方法来生成类的注释,传入表信息中的注释内容。
- bw.write("public class "+tableInfo.getBeanName()+" implements Serializable {"); 写入类的声明,表明这个类是公共的,并实现了Serializable接口。
2.生成字段声明:
- 遍历表信息中的字段列表,对于每个字段:BuildComment.createFieldComment(bw, fieldInfo.getComment()); 调用方法生成字段的注释。
- 根据字段的 SQL 类型进行不同的处理: 1.如果字段类型是特定的日期时间类型,写入格式化和反格式化表达式,格式为指定的日期时间格式(如YYYY_MM_DD_HH_MM_SS)。 2.如果字段类型是特定的日期类型,同样写入相应的格式化和反格式化表达式,格式为指定的日期格式(如YYYY_MM_DD)。 如果字段名称在需要忽略 JSON 序列化的字段列表中,写入特定的表达式来处理这个字段。
- bw.write("\tprivate "+fieldInfo.getJavaType()+" "+fieldInfo.getPropertyName()+";"); 写入字段的声明,包括字段的访问修饰符(private)、类型和名称。
三、生成get和set方法
//生成get,set方法
for(FieldInfo fieldInfo:tableInfo.getFieldIofoList()){
String tempField= StringUtils.uperCaseFirstLetter(fieldInfo.getPropertyName());
bw.write("\tpublic "+fieldInfo.getJavaType()+" get"+tempField+"(){");
bw.newLine();
bw.write("\t\treturn "+fieldInfo.getPropertyName()+";");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.write("\tpublic void set"+tempField+"("+fieldInfo.getJavaType()+" "+fieldInfo.getPropertyName()+"){");
bw.newLine();
bw.write("\t\tthis."+fieldInfo.getPropertyName()+" = "+fieldInfo.getPropertyName()+";");
bw.newLine();
bw.write("\t}");
bw.newLine();
}
这段 Java 代码的作用是为给定表信息中的每个字段生成对应的 getter 和 setter 方法,并将这些方法写入到一个输出流中。
1.遍历字段列表: for(FieldInfo fieldInfo:tableInfo.getFieldIofoList()){...} 循环遍历表信息中的字段列表。
2.生成 getter 方法:
- String tempField = StringUtils.uperCaseFirstLetter(fieldInfo.getPropertyName()); 将字段名称的首字母大写,用于生成 getter 和 setter 方法的名称。
- bw.write("\tpublic " + fieldInfo.getJavaType() + " get" + tempField + "(){"); 写入 getter 方法的声明,包括返回类型和方法名。
- bw.write("\t\treturn " + fieldInfo.getPropertyName() + ";"); 返回字段的值。
- bw.write("\t}"); 结束 getter 方法。
3.生成 setter 方法:
- bw.write("\tpublic void set" + tempField + "(" + fieldInfo.getJavaType() + " " + fieldInfo.getPropertyName() + "){"); 写入 setter 方法的声明,包括方法名和参数。
- bw.write("\t\tthis." + fieldInfo.getPropertyName() + " = " + fieldInfo.getPropertyName() + ";"); 将传入的参数赋值给字段。
- bw.write("\t}"); 结束 setter 方法。
四、生成toString方法
//生成toString方法
StringBuffer sb=new StringBuffer();
Integer index=0;
for (FieldInfo fieldInfo:tableInfo.getFieldIofoList()){
index++;
String properName=fieldInfo.getPropertyName();
if(ArrayUtils.contains(Constants.SQL_DATE_TIME_TYPES,fieldInfo.getSqlType())){
properName="DateUtils.format("+properName+",DateTimePatternEnum.YYYY_MM_DD_HH_MM_SS.getPattern())";
} else if (ArrayUtils.contains(Constants.SQL_DATE_TYPE,fieldInfo.getSqlType())) {
properName="DateUtils.format("+properName+",DateTimePatternEnum.YYYY_MM_DD.getPattern())";
}
sb.append(fieldInfo.getComment() + ":\" + ("+fieldInfo.getPropertyName()+" == null ? \"空\" : "+properName+")");
if(index<tableInfo.getFieldIofoList().size()){
sb.append("+").append("\",");
}
}
String toString= sb.toString();
toString="\""+toString;
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic String toString(){");
bw.newLine();
bw.write("\t\treturn "+toString+";");
bw.newLine();
bw.write("\t}");
bw.newLine();
这段 Java 代码的目的是为一个类生成toString方法。它遍历表信息中的字段列表,根据字段的类型对日期类型的字段进行特殊处理,然后构建一个字符串,该字符串包含每个字段的注释和格式化后的值,并在最后生成toString方法的实现,返回这个构建好的字符串。
1.初始化和遍历:
- StringBuffer sb = new StringBuffer(); 创建一个用于构建字符串的StringBuffer对象。
- Integer index = 0; 初始化一个用于计数的变量。
- for (FieldInfo fieldInfo : tableInfo.getFieldIofoList()){...} 遍历表信息中的字段列表。
2.处理日期类型字段: 根据字段的 SQL 类型进行判断,如果是日期时间类型或日期类型,对字段名进行特殊处理,使用DateUtils.format方法进行格式化,并传入相应的日期格式模式。
3.构建toString内容:
- 将字段的注释和处理后的字段值添加到StringBuffer中,如果不是最后一个字段,还会添加连接符+和逗号。
- String toString = sb.toString(); 将构建好的字符串赋值给一个变量。
- toString = """ + toString; 在字符串开头添加引号。
4.生成toString方法:
- bw.write("\t@Override"); 表示重写父类方法。
- bw.write("\tpublic String toString(){"); 开始写toString方法的声明。
- bw.write("\t\treturn " + toString + ";"); 返回构建好的字符串。
- bw.write("\t}"); 结束toString方法。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!