话不多说直接上代码
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);
}
}