最近接触了一个类似于代码生成工具的活。思路是,通过java的反射机制得到类的字段和字段类型,

从而可以创建一个map集合存储表名(由类名决定的特殊结构字符串),表字段(由类变量确定),表字段类型(由变量类型确定),DAO中通过将map传递给mybatis,在mybatis 中调用存储过程生成表。

1,在数据库中添加一个存储过程,如下

sp_createTable

  1. BEGIN
  2. DECLARE sql_text VARCHAR(2000);
  3. DROP TABLE IF EXISTS p_name;
  4. SET sql_text=CONCAT('CREATE TABLE ',p_name,p_fieldstr);
  5. SELECT sql_text;
  6. SET @sql_text=sql_text;
  7. PREPARE stmt FROM @sql_text;
  8. EXECUTE stmt;
  9. DEALLOCATE PREPARE stmt;
  10. END

2,mybatis中的sql语句如下:

  1. <select id="createTable" parameterType="java.util.Map" resultType="String">
  2. call sp_createTable(#{name},#{fields})
  3. </select>

3,DAO中方法

  1. public void createTable(Map<String, String> map);

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

  1. public Map<String, String> createTable(ModelEnum model, String className) {
  2. try {
  3. Class<?> clazz = Class.forName("com.me.info." + className);
  4. Field[] f = clazz.getDeclaredFields();
  5. String tableName = getTableName(model, className);
  6. Map<String, String> map = new HashMap<String, String>();
  7. String sql = "";
  8. for (int i = 0; i < f.length; i++) {
  9. Field field = f[i];
  10. String paramType = setParamterType(field);
  11. String param = field.getName();
  12. if (param.equals("id")) {
  13. sql += "(" + param + " " + paramType + " PRIMARY KEY NOT NULL,";// 主键";
  14. } else {
  15. sql += param + " " + paramType + ",";
  16. }
  17. }
  18. sql = sql.substring(0, sql.length() - 1);
  19. sql += ")";
  20. map.put("name", tableName);
  21. map.put("fields", sql);
  22. return map;
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. return null;
  27. }

5,获取字段类型的方法:setParamterType

  1. private static String setParamterType(Field f) throws Exception {
  2. if (("int").equals(f.getType().getCanonicalName())) {
  3. return "int(11)";
  4. } else if (("long").equals(f.getType().getCanonicalName())
  5. || ("java.lang.Long").equals(f.getType().getCanonicalName())) {
  6. return "int(11)";
  7. } else if (("float").equals(f.getType().getCanonicalName())) {
  8. return "float(10)";
  9. } else if (("float[]").equals(f.getType().getCanonicalName())) {
  10. return "varchar(255)";
  11. } else if (("java.lang.String").equals(f.getType().getCanonicalName())) {
  12. return "varchar(255)";
  13. } else if (("java.lang.Long[]").equals(f.getType().getCanonicalName())) {
  14. return "varchar(255)";
  15. } else if (("int[]").equals(f.getType().getCanonicalName())) {
  16. return "varchar(255)";
  17. }
  18. return null;
  19. }

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

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. AT&T汇编中系统调用和C函数调用的使用

    我的博客:www.while0.com 区别: 系统调用的参数存储在寄存器中,函数调用的则存储在堆栈中. 系统调用使用中断方式,函数调用使用call指令 相同之处: 都有返回值和输入值 返回值都存储在 ...

  2. MySQL源码之mysqld启动

    启动mysqld,并进入listen阶段   函数调用栈: mysqld_main():        my_init();初始化变量,锁,错误串      my_thread_global_init ...

  3. Codevs_1048_石子归并_(动态规划)

    描述 http://codevs.cn/problem/1048/  1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold       题目描述 Des ...

  4. selenium webdriver(4)---模拟鼠标键盘操作

    webdriver提供Actions来模拟鼠标悬浮.拖拽和键盘输入等操作,详细代码见org.openqa.selenium.interactions.Actions.本文通过几个实例来说明Action ...

  5. jQuery dataTables 网格

    对于服务器来说,可以通过请求参数来获得当前的操作信息. 类型 名称 说明 int iDisplayStart 显示的起始索引 int iDisplayLength 显示的行数 int iColumns ...

  6. lfs遇到的一些问题--编制LFS

    1.chroot后不要再打开新的终端了,没法用,还可能使系统崩溃.另外如果需要去睡觉,重启后要再次挂载并填充/dev和挂载虚拟内核文件系统,并再次运行chroot,可以将下列命令保存为脚本,重启后一次 ...

  7. SWFUpload无刷新文件批量上传

    一.首先将SWFUpload所有文件加入项目中,如图

  8. HDU 4737 A Bit Fun 2013成都 网络赛 1010

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4737 题目大意:给定一系列数,F(i,j)表示对从ai到aj连续求或运算,(i<=j)求F(i, ...

  9. 前端自动生成/加载CSS

    前言: 1.我很懒! 2.写样式时,很多时候需要单独设置长度.宽度.内间距.外间距等.于是,就会有很多CSS代码会出现很多类似以下的代码: .w20: { width: 20px; } .mt10: ...

  10. 大文件遍历shell脚本

    要求说明: 一.普通方法 无读写磁盘优化 有写磁盘优化 有读写磁盘优化 问题:脚本执行越来越慢 top ps aux vmstat 查看系统运行情况正常. 二.AWK 三.perl