任务:数据库文档

写文档的工作,真的是低效和重复劳动,前面的人不愿意,就喜欢压迫后面的人,前面的人自己没思路解决事情,就喜欢刷锅给后面的人。真想问问前面的人技术经验没啥提升,甩锅的技能又见长了。

前景介绍

由于公司的数据库用的是mongodb,ORM框架使用的是morphia框架,还有一个自定义注解Title,这个Title注解里面包括一个属性,就是描述字段信息。
作者只是做一个演示,每个公司用的描述字段注解肯定都不一样,只是提供一种思路。

需求:

将各个实体类的字段信息统计成一个Excel表

思路:

通过Java反射技术拿到相应的信息进行统计,并借助hutool工具类Excel工具对统计的信息进行导出。

做个模拟环境:

创建一个springboot项目,通过maven导入相关依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.8</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.mongodb.morphia</groupId>
    <artifactId>morphia</artifactId>
    <version>1.3.2</version>
</dependency>

这个自定义注解可以自定义名称,我这边直接就把Title搬过来用了
以下是Title的定义
image.png
Title注解可以定义到class和字段field上
image.png
以下是实现代码

@Test
void test01() throws ClassNotFoundException {

	Class<?> clz = Class.forName("***");
	Entity item = clz.getAnnotation(Entity.class);
	//获取字节码中的字段信息
	Field[] fields = clz.getDeclaredFields();

	//存储字段名称
	List<String> fieldNames = new ArrayList<>();
	//存储每个字段类型
	List<String> types = new ArrayList<>();
	//存储字段描述信息
	List<String> fieldDescriptions = new ArrayList<>();

	for (Field field : fields) {
    	Title annotation = field.getAnnotation(Title.class);
    	//获取字段名称
    	String fieldName = field.getName();
    	//获取字段描述信息
    	String fieldDescription = "";
    	if (annotation != null){
        	fieldDescription = annotation.title();
    	}
    	//获取字段数据类型
    	String dateType = field.getType().getSimpleName();
    	fieldNames.add(fieldName);
    	fieldDescriptions.add(fieldDescription);
    	types.add(dateType);

    	System.out.println("Field Name: " + fieldName);
    	System.out.println("Data Type: " + dateType);
    	System.out.println("Field Description: " + fieldDescription);

	}

	// 导出到Excel
	ExcelWriter writer = ExcelUtil.getWriter("d:/Yxbz.xlsx");
	writer.merge(2,"表名" +":"+ item.value());
	writer.addHeaderAlias("fieldName", "字段名");
	writer.addHeaderAlias("dateType","数据类型");
	writer.addHeaderAlias("fieldDescription", "字段描述");

	//构造ExcelData数据
	List<ExcelData> excelDataList = new ArrayList<>();
	for (int i = 0; i < fieldNames.size(); i++) {
    	ExcelData excelData = new ExcelData();
    	excelData.setFieldName(fieldNames.get(i));
    	excelData.setDateType(types.get(i));
   	 	excelData.setFieldDescription(fieldDescriptions.get(i));
    	excelDataList.add(excelData);
	}

	writer.write(excelDataList, true);
	writer.setColumnWidth(0, 20); // 设置第一列宽度
	writer.setColumnWidth(1, 20); // 设置第二列宽度
	writer.setColumnWidth(2, 30); // 设置第三列宽度
	writer.flush();
	writer.close();

}
public class ExcelData {

    //字段名称
    private String fieldName;
    //数据类型
    private String dateType;
    //描述详情
    private String fieldDescription;

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }

    public void setFieldDescription(String fieldDescription) {
        this.fieldDescription = fieldDescription;
    }

    public String getDateType() {
        return dateType;
    }

    public void setDateType(String dateType) {
        this.dateType = dateType;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值