当前位置:   article > 正文

根据类上的注解信息生成创建表的SQL语句

根据类上的注解信息生成创建表的SQL语句

第一步:创建实体类

定义一个实体类,在字段上使用knife4j的接口文档注解@ApiModelProperty注解指定字段名。

  1. package cn.edu.sgu.www.mhxysy.entity.role;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableId;
  4. import com.baomidou.mybatisplus.annotation.TableName;
  5. import com.fasterxml.jackson.annotation.JsonFormat;
  6. import io.swagger.annotations.ApiModel;
  7. import io.swagger.annotations.ApiModelProperty;
  8. import lombok.Data;
  9. import java.io.Serializable;
  10. import java.time.LocalDate;
  11. /**
  12. * 黑名单
  13. * @author heyunlin
  14. * @version 1.0
  15. */
  16. @Data
  17. @ApiModel
  18. @TableName("black_list")
  19. public class BlackList implements Serializable {
  20. private static final long serialVersionUID = 18L;
  21. @TableId(value = "id", type = IdType.AUTO)
  22. @ApiModelProperty(value = "ID")
  23. private Integer id;
  24. /**
  25. * 角色ID
  26. */
  27. @ApiModelProperty(value = "角色ID")
  28. private String roleId;
  29. /**
  30. * 角色名
  31. */
  32. @ApiModelProperty(value = "角色名")
  33. private String roleName;
  34. /**
  35. * 拉黑理由
  36. */
  37. @ApiModelProperty(value = "拉黑理由")
  38. private String reason;
  39. /**
  40. * 拉黑时间
  41. */
  42. @ApiModelProperty(value = "拉黑时间")
  43. @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
  44. private LocalDate operateTime;
  45. }

第二步:创建一个类保存表的信息

  1. package cn.edu.sgu.www.mhxysy.entity.other;
  2. import io.swagger.annotations.ApiModel;
  3. import io.swagger.annotations.ApiModelProperty;
  4. import lombok.Data;
  5. import java.io.Serializable;
  6. /**
  7. * @author heyunlin
  8. * @version 1.0
  9. */
  10. @Data
  11. @ApiModel
  12. public class ClassProperty implements Serializable {
  13. private static final long serialVersionUID = 18L;
  14. /**
  15. * 字段名称
  16. */
  17. @ApiModelProperty(value = "表名称")
  18. private String name;
  19. /**
  20. * 字段类型
  21. */
  22. @ApiModelProperty(value = "字段类型")
  23. private String dataType;
  24. /**
  25. * 字段注释
  26. */
  27. @ApiModelProperty(value = "字段注释")
  28. private String comment;
  29. }

第三步:Java和数据库的类型映射

 创建Java数据类型和表字段类型的对应关系

  1. package cn.edu.sgu.www.mhxysy.base;
  2. import java.time.LocalDate;
  3. import java.time.LocalDateTime;
  4. import java.util.Date;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * Java数据类型-字段类型
  9. * @author heyunlin
  10. * @version 1.0
  11. */
  12. public class FieldTypes {
  13. /**
  14. * 创建一个map,保存Java数据类型和数据库字段类型的映射关系
  15. */
  16. private static final Map<Class<?>, String> CLASS_STRING_MAP = new HashMap<>();
  17. static {
  18. CLASS_STRING_MAP.put(Integer.class, "int(11) unsigned");
  19. CLASS_STRING_MAP.put(Date.class, "date");
  20. CLASS_STRING_MAP.put(LocalDate.class, "date");
  21. CLASS_STRING_MAP.put(LocalDateTime.class, "datetime");
  22. CLASS_STRING_MAP.put(String.class, "varchar(255)");
  23. }
  24. public static String getType(Class<?> propertyType) {
  25. return CLASS_STRING_MAP.get(propertyType);
  26. }
  27. }

第四步:使用反射生成创建表的SQL语句

  1. package cn.edu.sgu.www.mhxysy;
  2. import cn.edu.sgu.www.mhxysy.base.FieldTypes;
  3. import cn.edu.sgu.www.mhxysy.entity.other.ClassProperty;
  4. import com.baomidou.mybatisplus.annotation.TableField;
  5. import io.swagger.annotations.ApiModelProperty;
  6. import org.junit.jupiter.api.Test;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import java.lang.reflect.Field;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. /**
  12. * springboot测试类
  13. * @author heyunlin
  14. * @version 1.0
  15. */
  16. @SpringBootTest
  17. class MhxysyTests {
  18. @Test
  19. void generateTableCreatementSQL() throws ClassNotFoundException {
  20. String className = "cn.edu.sgu.www.mhxysy.entity.role.BlackList";
  21. /*
  22. * 表名
  23. */
  24. String tableName = toLower(className);
  25. Class<?> type = Class.forName(className);
  26. // 获取类的所有字段信息
  27. Field[] fields = type.getDeclaredFields();
  28. List<ClassProperty> list = new ArrayList<>(fields.length);
  29. for (Field field : fields) {
  30. ClassProperty classProperty = new ClassProperty();
  31. // 字段名
  32. if (field.isAnnotationPresent(TableField.class)) {
  33. TableField tableField = field.getAnnotation(TableField.class);
  34. classProperty.setName(tableField.value());
  35. } else {
  36. classProperty.setName(toLower(field.getName()));
  37. }
  38. // 字段类型
  39. String fieldType = FieldTypes.getType(field.getType());
  40. classProperty.setDataType(fieldType);
  41. // 字段注释
  42. if (field.isAnnotationPresent(ApiModelProperty.class)) {
  43. ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
  44. classProperty.setComment(apiModelProperty.value());
  45. }
  46. list.add(classProperty);
  47. }
  48. // 开始拼接SQL语句
  49. StringBuilder sb = new StringBuilder();
  50. sb.append("create table ").append(tableName).append("(");
  51. for (ClassProperty classProperty : list) {
  52. if (!"serialVersionUID".equals(classProperty.getName())) {
  53. sb.append(classProperty.getName()).append(" ");
  54. sb.append(classProperty.getDataType()).append(" ");
  55. if ("id".equals(classProperty.getName())) {
  56. sb.append("primary key ");
  57. if (classProperty.getDataType().contains("int")) {
  58. sb.append("auto_increment ");
  59. }
  60. }
  61. sb.append("comment '").append(classProperty.getComment()).append("', ");
  62. }
  63. }
  64. String sql = sb.substring(0, sb.length() - 2) + ")";
  65. System.out.println(sql);
  66. }
  67. /**
  68. * 驼峰命名转下划线命名
  69. * @param str 待转换的字符串
  70. * @return String
  71. */
  72. public static String toLower(String str) {
  73. // 小写和大写紧挨一起的地方加上分隔符_,然后全部转为小写
  74. str = str.replaceAll("([a-z])([A-Z])", "$1_$2");
  75. return str.toLowerCase();
  76. }
  77. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/769331
推荐阅读
相关标签
  

闽ICP备14008679号