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

2014-11-24 11:54:45 · 作者: · 浏览: 256
e();
}

/**
* 建表操作
* @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 = getOneFieldInfo(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());

//