最近接触了一个类似于代码生成工具的活。思路是,通过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动态生成数据库表的更多相关文章

  1. sts使用mybatis插件直接生成数据库表的mapper类及配置文件

    首先点击help------>Eclipse Marketplace----->在find中搜索mybatis下面图片的第一个 点击installed 还需要一个配置文件generator ...

  2. Mybatis总结之如何自动生成数据库表结构

    一般情况下,用Mybatis的时候是先设计表结构再进行实体类以及映射文件编写的,特别是用代码生成器的时候. 但有时候不想用代码生成器,也不想定义表结构,那怎么办? 这个时候就会想到Hibernate, ...

  3. 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】

    一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...

  4. Java反射,注解,以及动态代理

    Java反射,注解,以及动态代理 基础  最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧[如有错误,望指正] Java ...

  5. 疑惑的 java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L

    在MAVEN项目里面,在整合spring和mybatis在执行数据库操作的时候报出了: java.lang.AbstractMethodError: org.mybatis.spring.transa ...

  6. java 反射提取类信息, 动态代理 和过滤某些方法演示

    java 反射提取类信息, 动态代理 和过滤某些方法演示 package org.rui.classts.reflects; import java.lang.reflect.Constructor; ...

  7. Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean

    问题描述: 一月 15, 2014 3:43:13 下午 org.springframework.context.support.AbstractApplicationContext prepareR ...

  8. java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer; at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.jav

    在整合spring和mybatis在执行数据库操作的时候报出了: java.lang.AbstractMethodError: org.mybatis.spring.transaction.Sprin ...

  9. java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L

    mybatis与springboot集成的时候,报错:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManag ...

随机推荐

  1. Linux命令行及Vim简单学习记录

    Linux命令行 1.打开命令行 Ctrl+Alt+t 2.目录 显示当前目录的文件列表 ls 跳转至当前目录中的x文件夹 cd x 返回根目录 cd 3.文件 新建文件1.cpp touch ./1 ...

  2. 【转】Android中设置TextView的颜色setTextColor--代码中设置字体颜色

    原文网址:http://www.cnblogs.com/myphoebe/archive/2012/01/06/2314728.html android中设置TextView的颜色有方法setText ...

  3. 详解Makefile 函数的语法与使用

    使用函数: 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使 ...

  4. GeoTools应用-DATA

    转自:http://blog.csdn.net/cdl2008sky/article/details/7266785 一.Geotools The Open Source Java GIS Toolk ...

  5. Net中的反射使用入门

    [转载] MSDN:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpcondiscoveringtypeinformatio ...

  6. applicationContext.xml 配置

    Hibernate SQL方言 (hibernate.dialect) 数据库 hibernate方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 ...

  7. python urllib2模块携带cookie

    今天干活遇到一个事.有一些网站的一些操作非得要求你登陆才能做,比如新浪微博,你要随便看看吧,不行,非得让你登陆了才能看,再比如一些用户操作,像更改自己的资料啦,个人的隐私啦巴拉巴拉的.想抓取这样的ur ...

  8. input hidden用法

    之前获取数据传数据,都是写在全局变量里,今天老板告诉我说用input hidden来存,我百度了一下,确实是个好方法,记录之: 1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或 ...

  9. Java String的== 与 equals小结

    package hashcode; public class LearnString { public static void main(String[] args) { //1.先在栈中创建一个对S ...

  10. python-面向对象(四)——类成员的访问方式汇总

    类成员的访问方式 #!/usr/bin/env python # _*_coding:utf-8 _*_ class pepole(object): '''This is __doc__ inform ...