Springboot 3.0.0基于swagger3.0的根据实体类建表SQL语句(postgresql系类数据库)

package com.xxx.xxxx.utils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.cqcloud.platform.entity.SysPaymentInfo;

import cn.hutool.core.lang.Console;
import io.swagger.v3.oas.annotations.media.Schema;

/**
 * 根据实体创建表sql语句
 * @author weimeilayer@gmail.com ✨
 * @date 💓💕 2024年8月6日 🐬🐇 💓💕
 */
public class SqlGenerator {

    public static String createTableSql(Class<?> clazz) {
        // 检查类是否包含 @TableName 注解
        if (!clazz.isAnnotationPresent(TableName.class)) {
            throw new IllegalArgumentException("The class must be annotated with @TableName");
        }

        // 初始化 StringBuilder 来构建 SQL 语句
        StringBuilder sql = new StringBuilder();
        TableName tableNameAnnotation = clazz.getAnnotation(TableName.class);
        String tableName = tableNameAnnotation.value();

        // 获取类级别的 @Schema 注解
        Schema classSchema = clazz.getAnnotation(Schema.class);
        String tableComment = (classSchema != null) ? classSchema.description() : clazz.getSimpleName();

        // 构建 SQL 语句的初始部分
        sql.append("drop table if exists ").append(tableName).append(" cascade;\n");
        sql.append("create table ").append(tableName).append(" (\n");

        // 获取类的所有字段
        Field[] fields = clazz.getDeclaredFields();
        String primaryKey = null;
        Map<String, String> columnComments = new HashMap<>();

        // 遍历每个字段
        for (Field field : fields) {
            // 跳过 serialVersionUID 字段
            if (field.getName().equals("serialVersionUID")) {
                continue;
            }

            // 跳过被 @TableField 注解并且 exist 属性为 false 的字段
            if (field.isAnnotationPresent(TableField.class) && field.getAnnotation(TableField.class).exist() == false) {
                continue;
            }

            // 初始化列名和列类型
            String columnName;
            String columnType = null;

            // 检查字段是否被 @TableId 注解
            if (field.isAnnotationPresent(TableId.class)) {
                TableId tableId = field.getAnnotation(TableId.class);
                columnName = tableId.value();
                if (tableId.type() == IdType.ASSIGN_ID) {
                    primaryKey = columnName;
                }
            } else {
                TableField tableField = field.getAnnotation(TableField.class);
                columnName = (tableField != null && !tableField.value().isEmpty()) ? tableField.value() : field.getName();
            }

            // 将列名从驼峰命名转换为下划线命名
            columnName = convertToUnderscore(columnName);

            // 根据字段类型设置列类型
            Class<?> fieldType = field.getType();
            if (fieldType == String.class) {
                columnType = "varchar(255)";
            } else if (fieldType == int.class || fieldType == Integer.class) {
                columnType = "integer";
            } else if (fieldType == long.class || fieldType == Long.class) {
                columnType = "bigint";
            } else if (fieldType == double.class || fieldType == Double.class) {
                columnType = "double precision";
            } else if (fieldType == BigDecimal.class) {
                columnType = "numeric(19, 2)";
            } else if (fieldType == boolean.class || fieldType == Boolean.class) {
                columnType = "boolean";
            } else if (fieldType == LocalDateTime.class) {
                columnType = "timestamp";
            }

            // 处理 @Schema 注解以获取列注释
            if (field.isAnnotationPresent(Schema.class)) {
                Schema schema = field.getAnnotation(Schema.class);
                columnComments.put(columnName, schema.description());
            }

            // 构建列定义部分的 SQL 语句
            sql.append("    ").append(columnName).append(" ").append(columnType);

            // 如果字段被 @TableId 注解,设置为主键
            if (field.isAnnotationPresent(TableId.class)) {
                sql.append(" primary key");
            }

            // 处理 @TableField 注解以设置默认值
            if (field.isAnnotationPresent(TableField.class)) {
                TableField tableField = field.getAnnotation(TableField.class);
                if (tableField.fill() == FieldFill.INSERT || tableField.fill() == FieldFill.UPDATE) {
                    sql.append(" default current_timestamp");
                }
            }

            // 添加列定义的结尾部分
            sql.append(",\n");
        }

        // 删除最后一个逗号并完成 SQL 语句
        sql.setLength(sql.length() - 2); // Remove the last comma
        sql.append("\n);\n");

        // 添加表和列的注释
        sql.append("comment on table \"public\".\"").append(tableName).append("\" IS '").append(tableComment).append("';\n");

        if (!columnComments.isEmpty()) {
            columnComments.forEach((columnName, comment) -> {
                sql.append("comment on column ").append(tableName).append(".").append(columnName)
                        .append(" IS '").append(comment).append("';\n");
            });
        }

        // 打印 SQL 语句
        Console.log(sql);
        return sql.toString();
    }

    // 辅助方法:将驼峰命名转换为下划线命名
    private static String convertToUnderscore(String camelCase) {
        StringBuilder result = new StringBuilder();
        for (char c : camelCase.toCharArray()) {
            if (Character.isUpperCase(c)) {
                result.append('_').append(Character.toLowerCase(c));
            } else {
                result.append(c);
            }
        }
        return result.toString();
    }

    // 执行调用方法
    public static void main(String[] args) {
        createTableSql(SysPaymentInfo.class);
    }
}

运行结果
在这里插入图片描述
实体案例
在这里插入图片描述

你好!要将Spring Boot 2.6与Swagger 3.0整合在一起,你可以按照以下步骤进行操作: 步骤1:添加Swagger依赖 在你的Spring Boot项目的pom.xml文件中,添加Swagger的依赖: ```xml <dependencies> <!-- 其他依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> </dependencies> ``` 步骤2:配置Swagger 创建一个Swagger配置类,用于配置Swagger的相关信息: ```java import org.springframework.context.annotation.Configuration; import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; @Configuration @EnableSwagger2 public class SwaggerConfig { public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("API 文档") .description("API 文档") .version("1.0.0") .build(); } } ``` 步骤3:启用Swagger 在你的Spring Boot应用程序的主类上使用`@EnableSwagger2`注解来启用Swagger: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Import; @SpringBootApplication @Import(SwaggerConfig.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 步骤4:访问Swagger UI 在启动你的应用程序后,你可以通过访问`http://localhost:8080/swagger-ui/`来查看生成的API文档。 以上就是将Spring Boot 2.6与Swagger 3.0整合的基本步骤。你可以根据自己的需要进一步定制和配置Swagger。希望能对你有所帮助!如果有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀͜͡傀儡师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值