zoukankan      html  css  js  c++  java
  • java反射的应用+mybatis+spring动态生成数据库表

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


    时间匆忙,整理中有遗漏或者错误,请多多指正。

  • 相关阅读:
    JavaScript学习总结(一)——ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
    IDEL——maven的搭建
    JDBC——Mysql 5.7绿色版配置安装过程
    JAVA的面向对象编程--------课堂笔记
    Javaweb第九章、jsp引入JSTL
    jsp引入JSTL后实现jsp的解耦
    servret的引入
    网页设计学习笔记小结
    jdk和Tomcat环境变量设置
    SLZ-VMware虚拟机_ORACLE安装监听器
  • 原文地址:https://www.cnblogs.com/myadmin/p/5122048.html
Copyright © 2011-2022 走看看