nfo(clazz, col); if(i > 0) sql.append(", "); sql.append("ADD `").append(col).append("` "); // 增加列名 sql.append(field.get(TYPE)); // 类型 sql.append("(").append(field.get(LENGTH)).append(") "); // 长度 sql.append(field.get(NULLABLE)); // 是否为空 sql.append(field.get(DEFAULTS)); // 默认值 } System.out.println("\n更新表: " + sql.toString()); // 更新表操作 Statement st = con.createStatement(); st.executeUpdate(sql.toString()); st.close(); // 建索引 checkCreateIndex(con, tableName, clazz); } // TODO 数据库连接方面需要改进 private static Connection getDBConnection(String driver, String urlDB, String user, String pwd) throws Exception { // 连接MYSQL数据库 Class.forName(driver); Connection conn = DriverManager.getConnection(urlDB, user, pwd); return conn; } /** * 根据配置源文件夹检查建数据表 */ public void genDB(Connection conn) { try { // 获取源文件夹下的所有类 Set> sources = PackageClass.find(sourceDir); // 遍历所有类,取出有注解的生成实体类 for(Class< > clazz : sources) { // 过滤没有EntityConfig注解的类, 并建表 if(clazz.isAnnotationPresent(EntityConfig.class)) { checkAndCreat(clazz, conn); } } // 关闭连接 conn.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 检查并建表或更新表结构 * @param clazz * @throws Exception */ public void checkAndCreat(Class< > clazz, Connection conn) throws Exception { // 获取表的信息 String catalog = null; String schema = "%"; String tableName = GenUtils.getTableName(clazz); String[] types = new String[] { "TABLE" }; DatabaseMetaData dBMetaData = conn.getMetaData(); // 从databaseMetaData获取表信息 ResultSet tableSet = dBMetaData.getTables(catalog, schema, tableName, types); // 如果表不存在, 则建表 if (!tableSet.next()) { createTable(conn, tableName, clazz); } else { //表存在, 则更新表 updateTable(conn, tableName, clazz); } // 关闭数据库连接 tableSet.close(); } public static void main(String[] args) throws Exception { args = new String[] {"com.test.testentity"}; String sourceDir = args[0]; String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/game"; String user = "root"; String pwd = ""; Connection conn = getDBConnection(driver, url, user, pwd); GenDB db = new GenDB(sourceDir); db.genDB(conn); }
}
3、补充介绍注解(上一篇博文用到确没有介绍的)。 可以用@interface来声明一个注解,其中的每一个方法实际上是声明了一个配置参数(注解只有一个配置参数,该参数的名称默认为value,并且可以省略。)。方法的名称就是参数的名称, 返回值类型就是参数的类型。可以通过default来声明参数的默认值。 @Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时 刻和源代码中。只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。@Target用来声明注解可以被添加在哪些类型 的元素上,如类型、方法和域等。具体元注解如下: [java] /* * 元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * ElemenetType.CONSTRUCTOR 构造器声明 * ElemenetType.FIELD 域声明(包括 enum 实例) * ElemenetType.LOCAL_VARIABLE 局部变量声明 * ElemenetType.METHOD 方法声明 * ElemenetType.PACKAGE 包声明 * ElemenetType.PARAMETER 参数声明 * ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 * * @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括: * RetentionPolicy.SOURCE 注解将被编译器丢弃 * RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃 * RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 * * @Documented |