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

2014-11-24 11:54:45 · 作者: · 浏览: 260
tants();
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.close();
}

/**
* 建表操作
* @param conn
* @param tableName
* @param clazz
* @throws Exception
*/
public void createTable(Connection conn, String tableName, Class< > clazz) throws Exception {
// 拼成SQL语句
StringBuilder sql = new StringBuilder();
sql.append("CREATE TABLE `").append(tableName).append("`"); // 建表
sql.append("(");
sql.append("`id` bigint(20) NOT NULL,"); // 创建默认主键

// 获取并遍历配置表字段
List> tableInfo = getTableInfo(clazz);
for(Map t : tableInfo) {
sql.append("`").append(t.get("name")).append("` "); // 字段名
sql.append(t.get(TYPE)); // 类型
sql.append("(").append(t.get(LENGTH)).append(") "); // 长度
sql.append(t.get(NULLABLE)); // 是否为空
sql.append(t.get(DEFAULTS)); // 默认值
sql.append(",");
}
sql.append("PRIMARY KEY (`id`)"); // 设置主键
sql.append(")");
System.out.println("\n建表: " + sql);

// 执行建表操作
Statement st = conn.createStatement();
st.executeUpdate(sql.toString());
st.close();

// 建索引
checkCreateIndex(conn, tableName, clazz);
}

/**
* 更新表操作
* @param con
* @param tableName
* @param clazz
* @throws Exception
*/
public void updateTable(Connection con, String tableName, Class< > clazz) throws Exception {
//获取表中列信息
DatabaseMetaData dBMetaData = con.getMetaData();
ResultSet colSet = dBMetaData .getColumns(null, "%", tableName, "%");

//表中已有的列名
List colTables = new ArrayList();
while(colSet.next()) {
colTables.add(colSet.getString("COLUMN_NAME"));
}
colSet.close();

//配置中的列名
List colConfs = getColumns(clazz);

// 如果数据表中列名包含配置表中全部列名, 则检查创建索引,不用更新表,直接返回
if(colTables.containsAll(colConfs)){
checkCreateIndex(con, tableName, clazz);
return;
}

// 找出两表列名不同
List colDifs = new ArrayList();
for(String col : colConfs) {
if(!colTables.contains(col)) {
colDifs.add(col);
}
}

// 取得配置中的表字段信息, 拼成SQL语句
StringBuffer sql = new StringBuffer();
sql.append("ALTER TABLE `").append(tableName).append("` "); // 更新表
for(int i = 0; i < colDifs.size(); i++) {
String col = colDifs.get(i);
Map field = getOneFieldI