场景:一个实体,几十个字段,Java实体类建一遍,数据库建一遍,痛苦面具
所需代码:
package me.xiaomaju.base; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Description 注解 表名 * @Author @xmj */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TableNameAnnotation { String value(); //表名 }TableNameAnnotation
package me.xiaomaju.base; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Description 注解 列名 * @Author @xmj */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface TableColumnAnnotation { String value();//列名 MySQLColumnType type() default MySQLColumnType.VARCHAR; //类型,默认varchar int length() default 20;//长度,默认20 }TableColumnAnnotation
package me.xiaomaju.base; /** * @Description 列类型枚举 * @Author @xmj */ public enum MySQLColumnType { CHAR, VARCHAR, INT, DOUBLE, FLOAT }MySQLColumnType
package me.xiaomaju.base; import java.lang.reflect.Field; /** * @Description 动态建表SQL工具类 * @Author @xmj */ public class DynamicSQLUtils { public static void main(String[] args) { String sql = getSQL("me.xiaomaju.entity.CiOrderDO"); System.out.println(sql); } public static String getSQL(String str){ StringBuffer sql=new StringBuffer(); Class<?> clazz= null; try { clazz = Class.forName(str); } catch (ClassNotFoundException e) { e.printStackTrace(); } TableNameAnnotation tn=clazz.getAnnotation(TableNameAnnotation.class); String tableName=tn.value(); sql.append("DROP TABLE IF EXISTS "+tableName+" ; "); sql.append("CREATE TABLE "+tableName+" ( "); Field[] fields=clazz.getDeclaredFields(); TableColumnAnnotation field = null; for(Field f:fields){ field =f.getAnnotation(TableColumnAnnotation.class); sql.append(field.value()+" "+field.type()+"("+field.length()+"),"); } sql.deleteCharAt(sql.length()-1); sql.append(")"); return sql.toString(); } }DynamicSQLUtils
实体类中使用注解:
运行 DynamicSQLUtils 中的 main 方法,将控制台的打印语句放到数据库工具中执行
个人认为可以改进的点:
1、拼接建表语句的时候把列的注释也拼进去(列注解最少要传2个参数)
2、写个JDBC执行SQL(个人还是喜欢用数据库工具)
3、获取指定包下面的所有实体的全类名,批量建表(目前表不是很多,没必要)
TRANSLATE with x English TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back 标签:lang,反射,java,String,sql,动态创建,import,注解,annotation From: https://www.cnblogs.com/xiaomaju/p/16875285.html