springboot,java 反射创建数据库表

----->码云地址
实现了 ResourceLoaderAware 接口 ,自定义实现了包扫描

   public Set<Class<?>> entityScan(String scanPath) {
        Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                .concat(ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(scanPath))
                        .concat("/**/*.class"));
        System.out.println("实体类包扫描路径 = " + packageSearchPath);
        Resource[] resources = new Resource[0];
        try {
            resources = resolver.getResources(packageSearchPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        MetadataReader metadataReader = null;
        for (Resource resource : resources) {
            if (resource.isReadable()) {
                try {
                    metadataReader = metadataReaderFactory.getMetadataReader(resource);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    // 当类型不是抽象类或接口在添加到集合
                    if (metadataReader.getClassMetadata().isConcrete()) {
                        classes.add(Class.forName(metadataReader.getClassMetadata().getClassName()));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return classes;
    }

利用反射获取类信息,注解,字段

 public Map<String, Set<EntityColumn>> entityMap(String scanPagePath){
        Set<Class<?>> classes = entityScan(scanPagePath);
        //Map<String,Map<String,String>> data = new HashMap<String, Map<String, String>>();
        Map<String,Set<EntityColumn>> em = new HashMap<>(classes.size());
        String tableName;
        Set<EntityColumn> columns = new LinkedHashSet<>();
        //Map<String,String> props = null;
        for (Class<?> entity : classes) {
            boolean entityAnnotationPresent = entity.isAnnotationPresent(Entity.class);
            boolean tableAnnotationPresent = entity.isAnnotationPresent(Table.class);
            if (entityAnnotationPresent){
                Entity e = entity.getAnnotation(Entity.class);
                String value = e.name();
                if (value.isEmpty()){
                    tableName = entity.getSimpleName().toLowerCase();
                }else {
                    tableName = value;
                }
            }else if (tableAnnotationPresent){
                Table t = entity.getAnnotation(Table.class);
                String value = t.name();
                if (value.isEmpty()){
                    tableName = entity.getSimpleName().toLowerCase();
                }else {
                    tableName = value;
                }
            }else {
                tableName = entity.getSimpleName().toLowerCase();
            }
            //System.out.println("类名" + tableName);

            //props = new HashMap<String,String>(entity.getDeclaredFields().length);
            columns = new LinkedHashSet<>(entity.getDeclaredFields().length);
            for (Field declaredField : entity.getDeclaredFields()) {
                String prop = declaredField.getName().toLowerCase();
                String type = declaredField.getType().getSimpleName().toLowerCase();
                //System.out.println("类型:属性 " + type+":"+prop);
                boolean annotationPresent = declaredField.isAnnotationPresent(Column.class);
                if (annotationPresent){
                    Column c = declaredField.getAnnotation(Column.class);
                    String cname = c.name();
                    boolean unique = c.unique();
                    boolean nullable = c.nullable();
                    int length = c.length();
                    //System.out.println(value);
                    if (cname.isEmpty()){
                        //props.put(prop,type);
                        EntityColumn ec = new EntityColumn(prop,unique,nullable,length,type);
                        columns.add(ec);
                    }else {
                        EntityColumn ec = new EntityColumn(cname,unique,nullable,length,type);
                        columns.add(ec);
                        //props.put(cname,type);
                    }
                }else {
                    //props.put(prop,type);
                    EntityColumn ec = new EntityColumn(prop,type);
                    columns.add(ec);
                }
            }
            em.put(tableName,columns);
            //data.put(tableName,props);
        }
     /*   for (Map.Entry<String, Set<EntityColumn>> entry : em.entrySet()) {
            System.out.println(entry);
        }*/
        //System.out.println(em);
        return em;
    }

生成sql语句

    public void create(String tableName, Set<EntityColumn> ec) {
        StringBuilder sb = new StringBuilder();
        sb.append("CREATE TABLE " + tableName + " (");
        for (EntityColumn column : ec) {
            String columnName = column.getName();
            String columnType = column.getType();
            int columnLength = column.getLength();
            boolean columnNullable = column.isNullable();
            boolean columnUnique = column.isUnique();
            String sqlColumnType = ColumnType.getSqlColumnType(columnType);
            String sqlColmunNullable = columnNullable ? "NULL ," : "NOT NULL ,";
            String sqlColmunUnique = columnUnique ? "UNIQUE(" + columnName + ") " : "";
            sb.append(columnName).append(space).append(sqlColumnType).append("(").append(columnLength).append(")").append(space).append(sqlColmunNullable).append(sqlColmunUnique).append(space);
        }
        String end = sb.toString().trim().replaceAll(",$", "") + ");";
        createSql = end;
        System.out.println("createSql = " + createSql);
        execute(createSql);
    }

定义字段类型

    public static String getSqlColumnType(String columnType) {
        map.put("string","varchar");
        map.put("char","char");
        map.put("int","int");
        map.put("integer","int");
        map.put("boolean","tinyint");
        map.put("long","bigint");
        map.put("object","int");
        return map.get(columnType);
    }

加载数据源配置


@ConfigurationProperties(
        prefix = "spring.datasource"
)
public class DataSourceConfig{
    private Class<? extends DataSource> type;
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    public Class<? extends DataSource> getType() {
        return type;
    }

    public void setType(Class<? extends DataSource> type) {
        this.type = type;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

实体类


@Table(name = "tb_user")
public class User {
    public User(String name, String pass, Long id) {
        this.name = name;
        this.pass = pass;
        this.id = id;
    }

    public User() {
    }
    @Column(name = "username")
    private String name;
    private String pass;
    @Id
    public Long id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    @Id
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值