最近接觸了一個類似於代碼生成工具的活。思路是,通過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; }
時間匆忙,整理中有遺漏或者錯誤,請多多指正。