最近接触了一个类似于代码生成工具的活。思路是,通过java的反射机制得到类的字段和字段类型,
从而可以创建一个map集合存储表名(由类名决定的特殊结构字符串),表字段(由类变量确定),表字段类型(由变量类型确定),DAO中通过将map传递给mybatis,在mybatis 中调用存储过程生成表。
1,在数据库中添加一个存储过程,如下
sp_createTable
BEGIN
DECLARE sql_text VARCHAR(2000);
DROP TABLE IF EXISTS p_name;
SET sql_text=CONCAT('CREATE TABLE ',p_name,p_fieldstr);
SELECT sql_text;
SET @sql_text=sql_text;
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
2,mybatis中的sql语句如下:
<select id="createTable" parameterType="java.util.Map" resultType="String">
call sp_createTable(#{name},#{fields})
</select>
3,DAO中方法
public void createTable(Map<String, String> map);
4,通过java反射生成字段列表及类型:
public Map<String, String> createTable(ModelEnum model, String className) {
try {
Class<?> clazz = Class.forName("com.me.info." + className);
Field[] f = clazz.getDeclaredFields();
String tableName = getTableName(model, className);
Map<String, String> map = new HashMap<String, String>();
String sql = "";
for (int i = 0; i < f.length; i++) {
Field field = f[i];
String paramType = setParamterType(field);
String param = field.getName();
if (param.equals("id")) {
sql += "(" + param + " " + paramType + " PRIMARY KEY NOT NULL,";// 主键";
} else {
sql += param + " " + paramType + ",";
}
}
sql = sql.substring(0, sql.length() - 1);
sql += ")";
map.put("name", tableName);
map.put("fields", sql);
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
5,获取字段类型的方法:setParamterType
private static String setParamterType(Field f) throws Exception {
if (("int").equals(f.getType().getCanonicalName())) {
return "int(11)";
} else if (("long").equals(f.getType().getCanonicalName())
|| ("java.lang.Long").equals(f.getType().getCanonicalName())) {
return "int(11)";
} else if (("float").equals(f.getType().getCanonicalName())) {
return "float(10)";
} else if (("float[]").equals(f.getType().getCanonicalName())) {
return "varchar(255)";
} else if (("java.lang.String").equals(f.getType().getCanonicalName())) {
return "varchar(255)";
} else if (("java.lang.Long[]").equals(f.getType().getCanonicalName())) {
return "varchar(255)";
} else if (("int[]").equals(f.getType().getCanonicalName())) {
return "varchar(255)";
}
return null;
}
时间匆忙,整理中有遗漏或者错误,请多多指正。