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

2014-11-24 11:54:45 · 作者: · 浏览: 254
t.put("name", name);
result.put(TYPE, type);
result.put(LENGTH, length);
result.put(INDEX, index);
result.put(NULLABLE, nullable);
result.put(DEFAULTS, defaults);

return result;
}

/**
* 获取表中所有字段信息
* @param clazz
* @return
* @throws Exception
*/
public List> getTableInfo(Class< > clazz) throws Exception {
List> tableInfo = new ArrayList>();

// 获得所有枚举字段成员(id, account, name, profession...),并遍历获取信息
Object[] enums = clazz.getEnumConstants();
for (Object e : enums) {
// 获取字段约束信息
Map field = getFieldInfo(clazz, e);
tableInfo.add(field);
}

return tableInfo;
}

/**
* 获取某个字段的约束信息
* @param clazz
* @param name
* @return
* @throws Exception
*/
public Map getOneFieldInfo(Class< > clazz, String name) throws Exception {
Map fieldInfo = new HashMap();
//返回所有枚举类型
Enum< >[] enums = (Enum[]) clazz.getEnumConstants();

for (Enum< > e : enums) {
// 如果不是想要的字段信息, 则跳过
if(!e.toString().equals(name)) {
continue;
}
// 获取字段约束信息
fieldInfo = getFieldInfo(clazz, e);
}

return fieldInfo;
}

/**
* 获取配置表中需要创建索引的字段
* @param clazz
* @return
* @throws Exception
*/
public List getIndexField(Class< > clazz) throws Exception {
List result = new ArrayList();
result.add("id"); // 默认id是索引

// 找出class中所有需要创建索引的字段
Object[] fields = clazz.getEnumConstants();
for(Object f : fields){
boolean index = (Boolean) GenUtils.getFieldValue(clazz, f, INDEX);
if(index) result.add(f.toString());
}

return result;
}

/**
* 在表上创建索引
* @param conn
* @param tableName
* @param clazz
* @param columns
* @throws SQLException
*/
public void checkCreateIndex(Connection conn, String tableName, Class< > clazz) throws Exception {
// 反射获取配置中待创建索引的列
List indexConfs = getIndexField(clazz);

// 表中加索引的列信息
List indexTables = new ArrayList();
DatabaseMetaData dbMeta = conn.getMetaData();
String schema = null;

// 获取表中索引信息
ResultSet indexs = dbMeta.getIndexInfo(null, schema, tableName, false, true);
while(indexs.next()) {
indexTables.add(indexs.getString("COLUMN_NAME"));
}
indexs.close();

// 若数据表索引包含配置类中全部索引,则不用建索引,直接返回
if(indexTables.containsAll(indexConfs)) {
return ;
}

// 找出配置中有,数据表中没有的索引
List indexDifs = new ArrayList();
for(String i : indexConfs) {
if(!indexTables.contains(i)) {
indexDifs.add(i);
}
}

// 创建索引
Statement st = conn.createStatement();
for(String column : indexDifs) {
String indexSql = "CREATE INDEX " + tableName + "_" + column + " ON " + tableName +"(" + column + ")";
System.out.println("建索引: " + indexSql);
st.executeUpdate(indexSql);
}
st.clos