|
@@ -0,0 +1,212 @@
|
|
|
+package com.citu.module.mp.dal.dataobject;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.annotation.TableId;
|
|
|
+import com.baomidou.mybatisplus.annotation.TableName;
|
|
|
+
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.lang.reflect.Method;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Locale;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author rayson
|
|
|
+ * @description generateTable
|
|
|
+ * @create 2024/5/11 下午3:10
|
|
|
+ **/
|
|
|
+public class BeanToGenerateTable {
|
|
|
+
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+
|
|
|
+ String sql = generateTableMysql("com.citu.module.mp.dal.dataobject.account.MpAccountDO", true);
|
|
|
+ System.out.println(sql);
|
|
|
+
|
|
|
+ String sql2 = generateTableMysql("com.citu.module.mp.dal.dataobject.material.MpMaterialDO", true);
|
|
|
+ System.out.println(sql2);
|
|
|
+
|
|
|
+ String sql3 = generateTableMysql("com.citu.module.mp.dal.dataobject.menu.MpMenuDO", true);
|
|
|
+ System.out.println(sql3);
|
|
|
+
|
|
|
+ String sql4 = generateTableMysql("com.citu.module.mp.dal.dataobject.message.MpAutoReplyDO", true);
|
|
|
+ System.out.println(sql4);
|
|
|
+
|
|
|
+ String sql5 = generateTableMysql("com.citu.module.mp.dal.dataobject.message.MpMessageDO", true);
|
|
|
+ System.out.println(sql5);
|
|
|
+
|
|
|
+ String sql6 = generateTableMysql("com.citu.module.mp.dal.dataobject.tag.MpTagDO", true);
|
|
|
+ System.out.println(sql6);
|
|
|
+
|
|
|
+ String sql7 = generateTableMysql("com.citu.module.mp.dal.dataobject.user.MpUserDO", true);
|
|
|
+ System.out.println(sql7);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 根据实体类自动生成Mysql建表sql
|
|
|
+ * @param beanName 实体类路径
|
|
|
+ * @param isConvert 是否需要转换驼峰格式
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String generateTableMysql(String beanName, boolean isConvert) {
|
|
|
+ StringBuilder sqlSb = new StringBuilder();
|
|
|
+
|
|
|
+ if (null != beanName && !"".equals(beanName)) {
|
|
|
+ Object obj = null;
|
|
|
+ try {
|
|
|
+ obj = Class.forName(beanName).newInstance();
|
|
|
+ } catch (InstantiationException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (ClassNotFoundException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ // 拿到该类
|
|
|
+ Class<?> clz = obj.getClass();
|
|
|
+ // 获取实体类的所有属性,返回Field数组
|
|
|
+ Field[] fields = clz.getDeclaredFields();
|
|
|
+ if (fields != null) {
|
|
|
+
|
|
|
+ //获取实体类的Table注解表名(导入persistence包)
|
|
|
+ TableName tableClass = clz.getAnnotation(TableName.class);
|
|
|
+ String tableName = "";
|
|
|
+ if (tableClass != null) {
|
|
|
+ tableName = tableClass.value();
|
|
|
+ }
|
|
|
+ sqlSb.append("drop table if exists " + tableName + "; \n");
|
|
|
+
|
|
|
+ sqlSb.append("create table " + tableName + "( \n");
|
|
|
+
|
|
|
+ String idKey = "";
|
|
|
+
|
|
|
+ for (Field field : fields) {
|
|
|
+ if (!field.isAccessible()) {
|
|
|
+ field.setAccessible(true);
|
|
|
+ }
|
|
|
+ String type = field.getGenericType().toString();
|
|
|
+ if (type.indexOf(".") == -1 || type.indexOf("java.") != -1) {//过滤实体对象
|
|
|
+ //截取最后一个.后面的字符
|
|
|
+ type = type.substring(type.lastIndexOf(".") + 1);
|
|
|
+ if (!field.getType().equals(List.class)) {// 不匹配list类型
|
|
|
+ //字段名称
|
|
|
+ String name = field.getName();
|
|
|
+
|
|
|
+ Method doSomeMethod = null;
|
|
|
+ try {
|
|
|
+ //获取get方法
|
|
|
+ doSomeMethod = clz.getDeclaredMethod("get" + name.substring(0, 1).toUpperCase() + name.substring(1));
|
|
|
+ } catch (NoSuchMethodException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ boolean isExist = true;
|
|
|
+ //属于表字段
|
|
|
+ if (isExist) {
|
|
|
+ StringBuilder convertName = new StringBuilder();
|
|
|
+ convertName.append(name);
|
|
|
+ //如果需要转换驼峰格式
|
|
|
+ if (isConvert) {
|
|
|
+ convertName = new StringBuilder();
|
|
|
+ for (int i = 0; i < name.length(); i++) {
|
|
|
+ //如果是大写前面先加一个_
|
|
|
+ if (isUpperCase(name.charAt(i))) {
|
|
|
+ convertName.append("_");
|
|
|
+ }
|
|
|
+ convertName.append(name.charAt(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ name = convertName.toString();
|
|
|
+ sqlSb.append(" `" + name.toLowerCase() + "` ");
|
|
|
+ //java 数据类型转换成 Oracle 字段数据类型
|
|
|
+ sqlSb.append(" " + societyMysql(type));
|
|
|
+ //判断该字段是否是Id主键(导入persistence包)
|
|
|
+ if (field.isAnnotationPresent(TableId.class)) {
|
|
|
+ TableId id = field.getAnnotation(TableId.class);
|
|
|
+ idKey = name.toLowerCase();//id主键字段
|
|
|
+ sqlSb.append(" NOT NULL ");
|
|
|
+ }
|
|
|
+ sqlSb.append(" comment ");
|
|
|
+ //字段属性说明(没有ApiModelProperty包的把这段代码注释掉)
|
|
|
+// if(field.isAnnotationPresent(ApiModelProperty.class)){
|
|
|
+// ApiModelProperty explain = field.getAnnotation(ApiModelProperty.class);
|
|
|
+// System.out.println("字段说明:"+explain.value());
|
|
|
+// sqlSb.append(" '"+explain.value()+"',\n" );
|
|
|
+// }else{
|
|
|
+ sqlSb.append(" '',\n");
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 字段属性说明
|
|
|
+ * 没有ApiModelProperty包的把上面那段代码注释掉,用这个
|
|
|
+ */
|
|
|
+ /*
|
|
|
+ sqlSb.append(" '',\n" );
|
|
|
+ */
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ sqlSb.append(" `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',\n" +
|
|
|
+ " `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n" +
|
|
|
+ " `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',\n" +
|
|
|
+ " `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n" +
|
|
|
+ " `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',\n" +
|
|
|
+ " `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',");
|
|
|
+ if (null != idKey && !"".equals(idKey)) {
|
|
|
+ sqlSb.append(" primary key (" + idKey + ") \n");
|
|
|
+ } else {
|
|
|
+ String lastStr = sqlSb.substring(0, sqlSb.length() - 1);
|
|
|
+ //如果最后一个字符是逗号结尾
|
|
|
+ if (lastStr.equals(",")) {
|
|
|
+ //删除最后一个字符
|
|
|
+ sqlSb = sqlSb.deleteCharAt(sqlSb.length() - 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sqlSb.append(" ); \n");
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return sqlSb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ //字母是否是大写
|
|
|
+ public static boolean isUpperCase(char c) {
|
|
|
+ return c >= 65 && c <= 90;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String societyMysql(String javaType) {
|
|
|
+ String oracleType = "";
|
|
|
+ if (javaType.equals("String")) {
|
|
|
+ oracleType = "varchar(255)";
|
|
|
+ }
|
|
|
+ //不区分大小写
|
|
|
+ else if (javaType.equalsIgnoreCase("BigDecimal")) {
|
|
|
+ oracleType = "decimal(6)";
|
|
|
+ } else if (javaType.equals("Date")) {
|
|
|
+ oracleType = "date";
|
|
|
+ } else if (javaType.equals("LocalDateTime")) {
|
|
|
+ oracleType = "datetime";
|
|
|
+ } else if (javaType.equals("Boolean") || javaType.equals("boolean")) {
|
|
|
+ oracleType = "bit(1)";
|
|
|
+ } else if (javaType.equalsIgnoreCase("Timestamp")) {
|
|
|
+ oracleType = "datetime";
|
|
|
+ } else if (javaType.equals("byte[]")) {
|
|
|
+ oracleType = "blob";
|
|
|
+ } else if (javaType.equals("int")) {
|
|
|
+ oracleType = "tinyint";
|
|
|
+ } else if (javaType.equals("Integer")) {
|
|
|
+ oracleType = "tinyint";
|
|
|
+ } else if (javaType.equals("Long") || javaType.equals("long")) {
|
|
|
+ oracleType = "bigint";
|
|
|
+ } else if (javaType.equalsIgnoreCase("double")) {
|
|
|
+ oracleType = "double";
|
|
|
+ } else if (javaType.equalsIgnoreCase("float")) {
|
|
|
+ oracleType = "float";
|
|
|
+ }
|
|
|
+ return oracleType;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|