当前位置:编程学习 > JAVA >>

反射+枚举+freemarker,自动生成实体类,自动建表建索引 之建表建索引,注解和DatabaseMetaData 获取信息

用反射+枚举+freemarker,自己实现的自动生成实体类和自动建立数据表建索引。用enum枚举作为数据表的配置文件,1个枚举就是1张表,根据枚举类,自动生成实体类,和自动建表建索引。
  主要步骤和上一篇博文差不多,就是先反射读取枚举类,获取所需信息,然后用freemarker生成实体类。这里也需要用到freemarker.jar这个jar包(点击下载)。由于是要建表,和建索引,需要用到底层数据库的javaAPI,所以也要先普及一下Java中DatabaseMetaData 元数据信息。
  1、Java中DatabaseMetaData 元数据信息
[java]
// 现获取DatabaseMetaData  
Class.forName("com.mysql.jdbc.Driver");   
String url = "jdbc:mysql://localhost:3306/test";   
String user = "root";   
String password = "root";   
Connection con = DriverManager.getConnection(url, user, password);   
DatabaseMetaData dbMetaData = con.getMetaData();   
 
// 表信息  
/**
* 每个表描述都有以下列: 
* TABLE_CAT String => 表类别(可为 null) 
* TABLE_SCHEM String => 表模式(可为 null) 
* TABLE_NAME String => 表名称 
* TABLE_TYPE String => 表类型。典型的类型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。 
* REMARKS String => 表的解释性注释 
* TYPE_CAT String => 类型的类别(可为 null) 
* TYPE_SCHEM String => 类型模式(可为 null) 
* TYPE_NAME String => 类型名称(可为 null) 
* SELF_REFERENCING_COL_NAME String => 有类型表的指定 "identifier" 列的名称(可为 null) 
* REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 "SYSTEM"、"USER" 和 "DERIVED"。(可能为 null)

*/ 
// table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".    
String[] types = { "TABLE" };   
ResultSet rs = dbMetaData.getTables(null, schemaName, "%", types);   
while (rs.next()) {   
    String tableName = rs.getString("TABLE_NAME");  //表名    
    String tableType = rs.getString("TABLE_TYPE");  //表类型    
    String remarks = rs.getString("REMARKS");       //表备注    
    System.out.println(tableName + "-" + tableType + "-" + remarks);   
}   
 
 
//获得表或视图中的所有列信息  
/**
* 每个列描述都有以下列: 

* TABLE_CAT String => 表类别(可为 null) 
* TABLE_SCHEM String => 表模式(可为 null) 
* TABLE_NAME String => 表名称 
* COLUMN_NAME String => 列名称 
* DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型 
* TYPE_NAME String => 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的 
* COLUMN_SIZE int => 列的大小。 
* BUFFER_LENGTH 未被使用。 
* DECIMAL_DIGITS int => 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。 
* NUM_PREC_RADIX int => 基数(通常为 10 或 2) 
* NULLABLE int => 是否允许使用 NULL。 
* columnNoNulls - 可能不允许使用 NULL 值 
* columnNullable - 明确允许使用 NULL 值 
* columnNullableUnknown - 不知道是否可使用 null 
* REMARKS String => 描述列的注释(可为 null) 
* COLUMN_DEF String => 该列的默认值,当值在单引号内时应被解释为一个字符串(可为 null) 
* SQL_DATA_TYPE int => 未使用 
* SQL_DATETIME_SUB int => 未使用 
* CHAR_OCTET_LENGTH int => 对于 char 类型,该长度是列中的最大字节数 
* ORDINAL_POSITION int => 表中的列的索引(从 1 开始) 
* IS_NULLABLE String => ISO 规则用于确定列是否包括 null。 
*       YES --- 如果参数可以包括 NULL 
*       NO --- 如果参数不可以包括 NULL 
*       空字符串 --- 如果不知道参数是否可以包括 null 
* SCOPE_CATLOG String => 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
* SCOPE_SCHEMA String => 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
* SCOPE_TABLE String => 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
* SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null) 
* IS_AUTOINCREMENT String => 指示此列是否自动增加 
*       YES --- 如果该列自动增加 
*       NO --- 如果该列不自动增加 
*       空字符串 --- 如果不能确定该列是否是自动增加参数 

*/ 
ResultSet rs = dbMetaData.getColumns(null, schemaName, tableName, "%");               
while (rs.next()){   
    String tableCat = rs.getString("TABLE_CAT");//表目录(可能为空)                    
    String tableSchemaName = rs.getString("TABLE_SCHEM");//表的架构(可能为空)       
    String tableName_ = rs.getString("TABLE_NAME");//表名    
    String columnName = rs.getString("COLUMN_NAME");//列名    
}  
 
 
//索引信息  
/**
* 每个索引列描述都有以下列: 

* TABLE_CAT String => 表类别(可为 null) 
* TABLE_SCHEM String => 表模式(可为 null) 
* TABLE_NAME String => 表名称 
* NON_UNIQUE boolean => 索引值是否可以不唯一。TYPE 为 tableIndexStatistic 时索引值为 false 
* INDEX_QUALIFIER String => 索引类别(可为 null);TYPE 为 tableIndexStatistic 时索引类别为 null 
* INDEX_NAME String => 索引名称;TYPE 为 tableIndexStatistic 时索引名称为 null 
* TYPE short => 索引类型: 
*       tableIndexStatistic - 此标识与表的索引描述一起返回的表统计信息 
*       tableIndexClustered - 此为集群索引 
*       tableIndexHashed - 此为散列索引 
*       tableIndexOther - 此为某种其他样式的索引 
* ORDINAL_POSITION short => 索引中的列序列号;TYPE 为 tableIndexStatistic 时该序列号为零 
* COLUMN_NAME String => 列名称;TYPE 为 tableIndexStatistic 时列名称为 null 
* ASC_OR_DESC String => 列排序序列,"A" => 升序,"D" => 降序,如果排序序列不受支持,可能为 null;TYPE 为 tableIndexStatistic 时排序序列为 null 
* CARDINALITY int => TYPE 为 tableIndexStatistic 时,它是表中的行数;否则,它是索引中唯一值的数量。 
* PAGES int => TYPE 为 tableIndexStatisic 时,它是用于表的页数,否则它是用于当前索引的页数。 
* FILTER_CONDITION String =>

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,