java mybatis 反射_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语句如下:

call sp_createTable(#{name},#{fields})

3,DAO中方法

public void createTable(Map map);

4,通过java反射生成字段列表及类型:

public Map createTable(ModelEnum model, String className) {

try {

Class> clazz = Class.forName("com.me.info." + className);

Field[] f = clazz.getDeclaredFields();

String tableName = getTableName(model, className);

Map map = new HashMap();

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;

}

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

随机推荐

Android开发各类常见错误解决方案

本文属于个人平时项目开发过程遇到的一些问题,记录下来并总结解决方案,希望能帮到大家解决问题,有些问题的解决方案是在StackoverFlow上找到的,建议大家遇到问题多去上面找,基本上都能找到解决方案 ...

怎么样使用yum来安装、卸载jdk

安装好的CentOS会自带OpenJdk,用命令 java -version ,会有下面的信息: java version "1.6.0"OpenJDK  Runtime Envi ...

javasrcipt中的for in 循环

function myFunction(){ var x;  //声明变量x: var txt="";  //声明变量txt并赋值为空: var person={fname:&qu ...

eclipse项目中启动项目无法载入类

在eclipse 项目中,当载入jar包后,加载里面的包,可以找到此类,但是编译运行的时候报错java.lang.ClassNotFoundException: 1,路径名未写正确: 2,配置出错; ...

各种浏览器hack

Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack.然后将Hack ...

crontab,想说爱你不easy

悲剧的背景 跑自己主动化脚本的机器连不上toastserver了, 仅仅能自己写个脚本每天跑了. 当然要放在crontab里了. 5 3 * * * sh ~/nosecron.sh 更悲剧的结果 第 ...

阻止安卓实体返回键后退的网页js实现

提供两种解决方法吧,都是网上来的,侵权删,毕竟我等只是搞后端的-- 第一种方法: // 阻止安卓实体键后退 // 页面载入时使用pushState插入一条历史记录 history.pushState( ...

python3打印当前时间和获取程序运行时间

学习使用time模块和datetime模块. 通常我们想让程序等待几秒钟,再继续向下运行,time模块的sleep()方法是一个很好的选择.但是想通过time模块打印系统的当前时间,则比较麻烦.如下: ...

regression and anova

regression一般是统计学的回归回归,研究一个随机变量Y对另一个(X)或一组(X1,X2,-,Xk)变量的相依关系的统计分析方法.研究一 个或多个随机变量Y1 ,Y2 ,-,Yi与另一些变量X1 ...

迅为-IMX6开发板十层PCB制造,24小时开机测试,满负荷测试运行俩天,没有死机

迅为-IMX6开发板——工业主板的优势 1.元器件 IMX6工业主板选料,选用经过长时间.高要求验证元器件,保证产品在复杂条件下,耐高温.抗潮湿等工业场合的需求. 2.PCB设计 IMX6工业主板采用 ...

你可能感兴趣的:(java,mybatis,反射)