jpa实体生成liquibase changeset

话不多说直接上代码

public class LiquibaseUtil {


    public static String generateCreateTableXML(Class<?> clazz){

        String tableName = Optional.ofNullable(clazz.getAnnotation(Table.class)).map(i->i.name()).orElse("please add tablename");
        String tremark = Optional.ofNullable(clazz.getAnnotation(ApiModel.class)).map(i -> i.value()).orElse("please add remark");

        StringBuilder builder = new StringBuilder();
        builder.append(String.format("<createTable tableName=\"%s\" remarks=\"%s\">\n",tableName,tremark));
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            String name = declaredField.getName();
            try {
                Field field = clazz.getDeclaredField(name);
                Column column = field.getAnnotation(Column.class);
                Class<?> type = declaredField.getType();
                String stype = "varchar(20)";
                if(type.equals(Long.class)||type.equals(Integer.class)){
                    stype="int";
                    if(name.equals("id")){
                        stype = "bigint";
                    }
                }else if(type.equals(Double.class)){
                    stype = "decimal(4,2)";
                }
                String cremark = Optional.ofNullable(field.getAnnotation(ApiModelProperty.class)).map(i -> i.value()).orElse("please add remark");

                builder.append(String.format("<column name=\"%s\" type=\"%s\" remarks=\"%s\">\n" +
                        "                <constraints nullable=\"true\" />\n" +
                        "            </column>\n",column.name(),stype,cremark));
            }catch (Exception e){

            }
        }
        builder.append("</createTable>");
        return builder.toString();
    }

    protected static List<String> findAllClasses(String packageName, ClassLoader loader) {
        List<String> result = Lists.newArrayList();
        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(loader);
        try {
            Resource[] resources = scan(loader, packageName);
            for (Resource resource : resources) {
                Class<?> clazz = loadClass(loader, metadataReaderFactory, resource);
                if (clazz != null) {
                    String s = generateCreateTableXML(clazz);
                    result.add(s);
                }
            }
        }
        catch (IOException ex) {
            throw new IllegalStateException(ex);
        }
        return result;
    }

    private static Resource[] scan(ClassLoader loader, String packageName) throws IOException {
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(loader);
        String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                + ClassUtils.convertClassNameToResourcePath(packageName) + "/**/*.class";
        return resolver.getResources(pattern);
    }

    private static Class<?> loadClass(ClassLoader loader, MetadataReaderFactory readerFactory, Resource resource) {
        try {
            MetadataReader reader = readerFactory.getMetadataReader(resource);
            return ClassUtils.forName(reader.getClassMetadata().getClassName(), loader);
        }
        catch (ClassNotFoundException | LinkageError ex) {
            ex.printStackTrace();
            return null;
        }
        catch (Throwable ex) {
            ex.printStackTrace();
            return null;
        }
    }

    //注解可以自定义
    @ApiModel("表注释")
    @Table(name = "table")
    class Test{

        @ApiModelProperty("主键")
        @Column(name = "id")
        private Long id;

        @ApiModelProperty("名字")
        @Column(name = "name")
        private Long name;

    }


    public static void main(String[] args) {
        //指定class生成changeset
        System.out.println(generateCreateTableXML(Test.class));

        //扫描包并生成changeset  依赖org.springframework.core.io.support
        List<String> result = findAllClasses("com.youngboy.file.entity", LiquibaseUtil.class.getClassLoader());
        result.stream().forEach(System.out::println);

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值