码迷,mamicode.com
首页 > 数据库 > 详细

java反射的应用+mybatis+spring动态生成数据库表

时间:2016-01-11 19:53:41      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:

最近接触了一个类似于代码生成工具的活。思路是,通过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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!