目录
- 前言
- 一、创建service文件以及导入所需的类
- 二、生成service类需要的方法
- 三、创建ServiceImpl文件以及生成导入语句
- 四、生成的ServiceImpl类文件中添加内容
- 五、遍历索引,生成基础增删改查
前言
写博客是为了记录和分享自己的学习,所分享内容是网上的资源,由于非原创项目,主要分享学习思路,只展示贴图部分代码(本人不分享本项目源码,支持项目付费)
一、创建service文件以及导入所需的类
//创建Service包
File folder = new File(Constants.PATH_SERVICE);
if(!folder.exists()){
folder.mkdirs();
}
String className=tableInfo.getBeanName()+Constants.SUFFIX_BEAN_SERVICE;
//创建Service文件
File file = new File(folder,className+".java");
OutputStream out=null;
OutputStreamWriter writer=null;
BufferedWriter bw=null;
out=new FileOutputStream(file);
writer=new OutputStreamWriter(out,"UTF-8");
bw=new BufferedWriter(writer);
//生成包名
bw.write("package "+Constants.PACKAGE_SERVICE+";");
bw.newLine();
bw.newLine();
bw.write("import "+Constants.PACKAGE_PO+"."+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+";");
bw.newLine();
bw.write("import "+Constants.PACKAGE_QUREY+"."+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_QUREY+";");
bw.newLine();
bw.write("import "+Constants.PACKAGE_VO+".PaginationResultVO;");
bw.newLine();
bw.write("import java.util.List;");
bw.newLine();
这段代码用于创建一个 Service 包(如果该包不存在的话),并在该包中创建一个以特定名称命名的 Java 文件。然后,向该文件中写入 Java 类的包声明以及导入必要的类。
- 创建 Service 包和文件
- File folder = new File(Constants.PATH_SERVICE);:通过一个常量路径创建一个表示 Service 包的File对象。
- if(!folder.exists()){ folder.mkdirs(); }:如果该包对应的文件路径不存在,则创建这个目录。
- String className = tableInfo.getBeanName() + Constants.SUFFIX_BEAN_SERVICE;:根据表信息获取服务类的名称。
- File file = new File(folder, className + “.java”);:在已创建的 Service 包中创建一个以特定名称命名的 Java 文件。
- 准备写入文件
- OutputStream out = null;、OutputStreamWriter writer = null;、BufferedWriter bw = null;:声明输出流、输出流写入器和缓冲写入器,用于向文件写入内容。
- out = new FileOutputStream(file);:创建一个文件输出流,指向要创建的 Java 文件。
- writer = new OutputStreamWriter(out, “UTF-8”);:使用指定的字符编码创建一个输出流写入器,包裹文件输出流。
- bw = new BufferedWriter(writer);:创建一个缓冲写入器,包裹输出流写入器,以提高写入效率。
- 写入内容
- 生成包名:bw.write("package " + Constants.PACKAGE_SERVICE + “;”);,写入服务类所在的包名。
- 导入必要的类:
bw.write("import " + Constants.PACKAGE_PO + “.” + tableInfo.getBeanName() + Constants.SUFFIX_BEAN_PO + “;”);:导入实体类。
bw.write("import " + Constants.PACKAGE_QUREY + “.” + tableInfo.getBeanName() + Constants.SUFFIX_BEAN_QUREY + “;”);:导入查询对象类。
bw.write("import " + Constants.PACKAGE_VO + “.PaginationResultVO;”);:导入分页结果视图对象类。
bw.write(“import java.util.List;”);:导入java.util.List类,用于表示列表。
二、生成service类需要的方法
//生成类名
bw.newLine();
BuildComment.createClassComment(bw, tableInfo.getComment()+" Service");
bw.write("public interface "+className+" {");
bw.newLine();
BuildComment.createFieldComment(bw,"根据条件查询列表");
bw.write("\tList<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> findListByParam("+tableInfo.getBeanParamName()+" param);");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"根据条件查询数量");
bw.write("\tInteger findCountByParam("+tableInfo.getBeanParamName()+" query);");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"分页查询");
bw.write("\tPaginationResultVO<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> findListByPage("+tableInfo.getBeanParamName()+" query);");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"新增");
bw.write("\tInteger add("+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+" bean);");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"批量新增");
bw.write("\tInteger addBatch(List<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> listBean);");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"批量新增或修改");
bw.write("\tInteger addOrUpdateBatch(List<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> listBean);");
bw.newLine();
bw.newLine();
for(Map.Entry<String,List<FieldInfo>> entry:tableInfo.getKeyIndexMap().entrySet()){
List<FieldInfo> fieldInfoList = entry.getValue();
Integer index=0;
StringBuilder methodName = new StringBuilder();
StringBuilder methodParamName = new StringBuilder();
for(FieldInfo fieldInfo:fieldInfoList){
index++;
methodName.append(StringUtils.uperCaseFirstLetter(fieldInfo.getPropertyName()));
if(index<fieldInfoList.size()){
methodName.append("And");
}
methodParamName.append(fieldInfo.getJavaType()+" "+fieldInfo.getPropertyName());
if(index<fieldInfoList.size()){
methodParamName.append(",");
}
}
//TODO 类目一致
BuildComment.createFieldComment(bw,"根据"+methodName+"查询");
bw.write("\t"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+" selectBy"+ methodName+"("+methodParamName+");");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"根据"+methodName+"更新");
bw.write("\t Integer updateBy"+ methodName+"("+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+" bean,"+methodParamName+");");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"根据"+methodName+"删除");
bw.write("\t Integer deleteBy"+ methodName+"("+methodParamName+");");
bw.newLine();
bw.newLine();
这段代码在生成的service类文件中继续添加内容,包括生成类名、注释以及定义各种服务方法的接口。这些方法涵盖了根据条件查询列表、查询数量、分页查询、新增、批量新增、批量新增或修改,以及根据特定字段组合进行查询、更新和删除等功能。
- 生成类名和接口声明:
- BuildComment.createClassComment(bw, tableInfo.getComment() + " Service");:调用方法生成类的注释。
- bw.write(“public interface " + className + " {”);:声明一个类接口,接口名为根据表信息生成的类名。
- 定义服务方法:
- 对于每个方法,首先使用BuildComment.createFieldComment(bw, “方法描述”)生成方法的注释,然后定义方法签名。
- 方法包括:
- 根据条件查询列表:List<实体类名> findListByParam(参数类型 param);。
- 根据条件查询数量:IntegerfindCountByParam(参数类型 query);。
- 分页查询:PaginationResultVO<实体类名>findListByPage(参数类型 query);。
- 新增:Integer add(实体类名 bean);。
- 批量新增:Integer addBatch(List<实体类名> listBean);。
- 批量新增或修改:Integer addOrUpdateBatch(List<实体类名> listBean);。
- 对于每个键索引对应的字段组合,定义查询、更新和删除方法:
查询:实体类名 selectBy方法名(参数列表);。
更新:Integer updateBy方法名(实体类名 bean, 参数列表);。
删除:Integer deleteBy方法名(参数列表);。
三、创建ServiceImpl文件以及生成导入语句
//创建ServiceImpl包
File folder = new File(Constants.PATH_SERVICE_IMPL);
if(!folder.exists()){
folder.mkdirs();
}
String mapperName=tableInfo.getBeanName()+Constants.SUFFIX_BEAN_MAPPER;
String mapperBeanName=StringUtils.lowerCaseFirstLetter(mapperName);
String className=tableInfo.getBeanName()+Constants.SUFFIX_BEAN_SERVICE_IMPL;
//创建ServiceImpl文件
File file = new File(folder,className+".java");
OutputStream out=null;
OutputStreamWriter writer=null;
BufferedWriter bw=null;
out=new FileOutputStream(file);
writer=new OutputStreamWriter(out,"UTF-8");
bw=new BufferedWriter(writer);
//生成包名
bw.write("package "+Constants.PACKAGE_SERVICE_IMPL+";");
bw.newLine();
bw.newLine();
bw.write("import org.springframework.stereotype.Service;");
bw.newLine();
bw.write("import javax.annotation.Resource;");
bw.newLine();
bw.write("import "+Constants.PACKAGE_SERVICE+"."+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_SERVICE+";");
bw.newLine();
bw.write("import "+Constants.PACKAGE_PO+"."+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+";");
bw.newLine();
bw.write("import "+Constants.PACKAGE_QUREY+"."+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_QUREY+";");
bw.newLine();
bw.write("import "+Constants.PACKAGE_MAPPER+"."+mapperName+";");
bw.newLine();
bw.write("import "+Constants.PACKAGE_VO+".PaginationResultVO;");
bw.newLine();
bw.write("import java.util.List;");
bw.newLine();
bw.write("import "+Constants.PACKAGE_ENUM+".PageSize;");
bw.newLine();
bw.write("import "+Constants.PACKAGE_QUREY+".SimplePage;");
bw.newLine();
创建一个名为ServiceImpl的包(如果该包不存在的话),并在该包中创建一个以特定名称命名的 Java 文件。然后,向该文件中写入 Java 类的包声明以及导入必要的类和包。
- 创建ServiceImpl包
- File folder = new File(Constants.PATH_SERVICE_IMPL);:通过一个常量路径创建一个表示ServiceImpl包的File对象。
- if(!folder.exists()){ folder.mkdirs(); }:如果该包对应的文件路径不存在,则创建这个目录。
- 创建ServiceImpl文件
- String mapperName = tableInfo.getBeanName() + Constants.SUFFIX_BEAN_MAPPER;:获取 Mapper 类的名称。
- String mapperBeanName = StringUtils.lowerCaseFirstLetter(mapperName);:将 Mapper 类名的首字母小写,可能用于作为 Mapper 的实例变量名。
- String className = tableInfo.getBeanName() + Constants.SUFFIX_BEAN_SERVICE_IMPL;:根据表信息获取服务实现类的名称。
- File file = new File(folder, className + “.java”);:在已创建的ServiceImpl包中创建一个以特定名称命名的 Java 文件。
- 准备写入文件
- OutputStream out = null;、OutputStreamWriter writer = null;、BufferedWriter bw = null;:声明输出流、输出流写入器和缓冲写入器,用于向文件写入内容。
- out = new FileOutputStream(file);:创建一个文件输出流,指向要创建的 Java 文件。
- writer = new OutputStreamWriter(out, “UTF-8”);:使用指定的字符编码创建一个输出流写入器,包裹文件输出流。
- bw = new BufferedWriter(writer);:创建一个缓冲写入器,包裹输出流写入器,以提高写入效率。
- 写入内容
- 生成包名:bw.write("package " + Constants.PACKAGE_SERVICE_IMPL + “;”);,写入服务实现类所在的包名。
- 导入必要的类和包:
- bw.write(“import org.springframework.stereotype.Service;”);:导入 Spring的@Service注解。
- bw.write(“import javax.annotation.Resource;”);:导入@Resource注解用于依赖注入。
- bw.write("import " + Constants.PACKAGE_SERVICE + “.” + tableInfo.getBeanName() +Constants.SUFFIX_BEAN_SERVICE + “;”);:导入服务接口类。
- bw.write("import " +Constants.PACKAGE_PO + “.” + tableInfo.getBeanName() +Constants.SUFFIX_BEAN_PO + “;”);:导入实体类。
- bw.write("import " + Constants.PACKAGE_QUREY + “.” + tableInfo.getBeanName() +Constants.SUFFIX_BEAN_QUREY + “;”);:导入查询对象类。
- bw.write("import " +Constants.PACKAGE_MAPPER + “.” + mapperName + “;”);:导入 Mapper 类。
- bw.write(“import " + Constants.PACKAGE_VO +”.PaginationResultVO;");:导入分页结果视图对象类。
- bw.write(“import.java.util.List;”);:导入java.util.List类,用于表示列表。
- bw.write("import " +Constants.PACKAGE_ENUM + “.PageSize;”);:导入自定义的枚举类。
- bw.write("import "+ Constants.PACKAGE_QUREY + “.SimplePage;”);:导入分页查询对象类
。
四、生成的ServiceImpl类文件中添加内容
//生成类名
bw.newLine();
BuildComment.createClassComment(bw, tableInfo.getComment());
bw.write("@Service(\""+mapperName+"\")");
bw.newLine();
bw.write("public class "+className+" implements "+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_SERVICE+" {");
bw.newLine();
bw.newLine();
bw.write("\t@Resource");
bw.newLine();
bw.write("\tprivate "+mapperName+"<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+","+tableInfo.getBeanParamName()+"> "+mapperBeanName+";");
bw.newLine();
bw.newLine();
//TODO
BuildComment.createFieldComment(bw,"根据条件查询列表");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic List<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> findListByParam("+tableInfo.getBeanParamName()+" param) {");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".selectList(param);");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"根据条件查询数量");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic Integer findCountByParam("+tableInfo.getBeanParamName()+" param) {");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".selectCount(param);");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"分页查询");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic PaginationResultVO<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> findListByPage("+tableInfo.getBeanParamName()+" query) {");
bw.newLine();
bw.write("\t\t Integer count=this.findCountByParam(query);");
bw.newLine();
bw.write("\t\t Integer pageSize = query.getPageSize()==null?PageSize.SIZE15.getSize():query.getPageSize();");
bw.newLine();
bw.write("\t\t SimplePage page = new SimplePage(query.getPageNo(), count, pageSize);");
bw.newLine();
bw.write("\t\t query.setSimplePage(page);");
bw.newLine();
bw.write("\t\t List<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> list = this.findListByParam(query);");
bw.newLine();
bw.write("\t\t PaginationResultVO<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> result = new PaginationResultVO(count, page.getPageSize(),page.getPageNo(),page.getPageTotal(),list);");
bw.newLine();
bw.write("\t\t return result;");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"新增");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic Integer add("+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+" bean) {");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".insert(bean);");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"批量新增");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic Integer addBatch(List<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> listBean) {");
bw.newLine();
bw.write("\t\tif(listBean == null || listBean.isEmpty()) {");
bw.newLine();
bw.write("\t\t\treturn 0;");
bw.newLine();
bw.write("\t\t}");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".insertBatch(listBean);");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"批量新增或修改");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic Integer addOrUpdateBatch(List<"+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+"> listBean) {");
bw.newLine();
bw.write("\t\tif(listBean == null || listBean.isEmpty()) {");
bw.newLine();
bw.write("\t\t\treturn 0;");
bw.newLine();
bw.write("\t\t}");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".insertBatchOrUpdate(listBean);");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
这段代码在生成的ServiceImpl类文件中继续添加内容,包括生成类名、添加注解、定义成员变量以及实现服务接口中的各个方法
- 生成类名和添加注解:
-
BuildComment.createClassComment(bw, tableInfo.getComment());:调用方法生成类的注释。
-
bw.write(“@Service(”" + mapperName + “”)");:添加@Service注解,并指定服务的名称为 Mapper 类名。
-
bw.write("public class " + className + " implements " + tableInfo.getBeanName() +Cw 创建分页结果视图对象并返回。
-
新增:调用 Mapper 中的insert方法,传入参数并返回结果。
-
批量新增:检查列表是否为空,若为空则返回 0。调用 Mapper 中的insertBatch方法,传入列表并返回结果。
-
批量新增或修改:检查列表是否为空,若为空则返回 0。调用 Mapper 中的insertBatchOrUpdate方法(可能在 Mapper 中没有实现这个方法,需要根据实际情况进行调整),传入列表并返回结果。
五、遍历索引,生成基础增删改查
for(Map.Entry<String, List<FieldInfo>> entry:tableInfo.getKeyIndexMap().entrySet()){
List<FieldInfo> fieldInfoList = entry.getValue();
Integer index=0;
StringBuilder methodName = new StringBuilder();
StringBuilder methodParamName = new StringBuilder();
StringBuilder paramsBuilder = new StringBuilder();
for(FieldInfo fieldInfo:fieldInfoList){
index++;
methodName.append(StringUtils.uperCaseFirstLetter(fieldInfo.getPropertyName()));
if(index<fieldInfoList.size()){
methodName.append("And");
}
methodParamName.append(fieldInfo.getJavaType()+" "+fieldInfo.getPropertyName());
paramsBuilder.append(fieldInfo.getPropertyName());
if(index<fieldInfoList.size()){
methodParamName.append(",");
paramsBuilder.append(",");
}
}
//TODO 类目一致
BuildComment.createFieldComment(bw,"根据"+methodName+"查询");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic "+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+" selectBy"+ methodName+"("+methodParamName+") {");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".selectBy"+methodName+"("+paramsBuilder+");");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"根据"+methodName+"更新");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic Integer updateBy"+ methodName+"("+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+" bean,"+methodParamName+") {");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".updateBy"+methodName+"(bean,"+paramsBuilder+");");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
BuildComment.createFieldComment(bw,"根据"+methodName+"删除");
bw.write("\t@Override");
bw.newLine();
bw.write("\tpublic Integer deleteBy"+ methodName+"("+methodParamName+") {");
bw.newLine();
bw.write("\t\treturn this."+mapperBeanName+".deleteBy"+methodName+"("+paramsBuilder+");");
bw.newLine();
bw.write("\t}");
bw.newLine();
bw.newLine();
遍历表的键索引映射,针对每个键对应的字段组合,在服务实现类中实现了根据这些字段组合进行查询、更新和删除的方法。
- 遍历键索引映射:
- for(Map.Entry<String, List> entry:tableInfo.getKeyIndexMap().entrySet()){…}:遍历表的键索引映射,获取每个键对应的字段信息列表。
- 生成方法名和参数名:
- 对于每个字段信息列表,遍历其中的字段信息:
Integer index=0; StringBuilder methodName = new StringBuilder(); StringBuilder methodParamName = new StringBuilder(); StringBuilder paramsBuilder = new StringBuilder();:初始化索引、方法名、方法参数名和参数构建器的字符串构建器。 - 在循环中,拼接方法名和方法参数名,将属性名首字母大写后添加到方法名中,同时构建参数名形式为 “类型 属性名”,并将属性名添加到参数构建器中。如果不是最后一个字段,则在方法名和方法参数名中添加 “And” 进行连接,在参数构建器中添加逗号分隔。
- 实现查询方法:
- 添加注释:BuildComment.createFieldComment(bw,“根据”+methodName+“查询”);。
- 添加@Override注解:bw.write(“\t@Override”);。
- 定义方法签名:bw.write(“\tpublic “+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+” selectBy”+ methodName+“(”+methodParamName+“) {”);。
- 调用 Mapper 中的方法实现查询:bw.write(“\t\treturn this.”+mapperBeanName+“.selectBy”+methodName+“(”+paramsBuilder+“);”);,通过 Mapper 对象调用对应的查询方法,并返回结果。
- 实现更新方法:
- 添加注释:BuildComment.createFieldComment(bw,“根据”+methodName+“更新”);。
添加@Override注解:bw.write(“\t@Override”);。 - 定义方法签名:bw.write(“\tpublic Integer updateBy”+ methodName+“(”+tableInfo.getBeanName()+Constants.SUFFIX_BEAN_PO+" bean,“+methodParamName+”) {");。
- 调用 Mapper 中的方法实现更新:bw.write(“\t\treturn this.”+mapperBeanName+“.updateBy”+methodName+“(bean,”+paramsBuilder+“);”);,通过 Mapper 对象调用对应的更新方法,并返回结果。
- 实现删除方法:
- 添加注释:BuildComment.createFieldComment(bw,“根据”+methodName+“删除”);。
- 添加@Override注解:bw.write(“\t@Override”);。
- 定义方法签名:bw.write(“\tpublic Integer deleteBy”+ methodName+“(”+methodParamName+“) {”);。
- 调用 Mapper 中的方法实现删除:bw.write(“\t\treturn this.”+mapperBeanName+“.deleteBy”+methodName+“(”+paramsBuilder+“);”);,通过 Mapper 对象调用对应的删除方法,并返回结果。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!