标签:
最近接触了一个类似于代码生成工具的活。思路是,通过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; }
时间匆忙,整理中有遗漏或者错误,请多多指正。
java反射的应用+mybatis+spring动态生成数据库表
标签:
原文地址:http://www.cnblogs.com/myadmin/p/5122048.html