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;
}
时间匆忙,整理中有遗漏或者错误,请多多指正。
java反射的应用+mybatis+spring动态生成数据库表的更多相关文章
- sts使用mybatis插件直接生成数据库表的mapper类及配置文件
首先点击help------>Eclipse Marketplace----->在find中搜索mybatis下面图片的第一个 点击installed 还需要一个配置文件generator ...
- Mybatis总结之如何自动生成数据库表结构
一般情况下,用Mybatis的时候是先设计表结构再进行实体类以及映射文件编写的,特别是用代码生成器的时候. 但有时候不想用代码生成器,也不想定义表结构,那怎么办? 这个时候就会想到Hibernate, ...
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
- Java反射,注解,以及动态代理
Java反射,注解,以及动态代理 基础 最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧[如有错误,望指正] Java ...
- 疑惑的 java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L
在MAVEN项目里面,在整合spring和mybatis在执行数据库操作的时候报出了: java.lang.AbstractMethodError: org.mybatis.spring.transa ...
- java 反射提取类信息, 动态代理 和过滤某些方法演示
java 反射提取类信息, 动态代理 和过滤某些方法演示 package org.rui.classts.reflects; import java.lang.reflect.Constructor; ...
- Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
问题描述: 一月 15, 2014 3:43:13 下午 org.springframework.context.support.AbstractApplicationContext prepareR ...
- 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 ...
- java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L
mybatis与springboot集成的时候,报错:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManag ...
随机推荐
- 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)
第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...
- 关于java IO 过程当中同时读写的问题
今天在写一个linux的java守护进程的时候,无意间就用到了java同时读写的功能. 看错误代码: package cn.sunchuanzhen.main; import java.io.Buff ...
- win7 下安装oracle 10g
oracle 10g 在win7下安装,提示程序异常终止,发生未知错误 在网上搜结果: 修改Oracle 10G\database\stage\prereq\db\refhost.xml 在 < ...
- Navigation Drawer(导航抽屉)
目录(?)[-] 创建一个导航抽屉 创建抽屉布局 初始化抽屉列表 处理导航项选点击事件 监听导航抽屉打开和关闭事件 点击应用图标来打开和关闭导航抽屉 创建一个导航抽屉 导航抽屉是一个位于屏幕左侧边缘用 ...
- 【ArcGIS Server 开发系列】Flyingis六大系列讲座精品PDF奉献
转自:http://www.cnblogs.com/gispeng/archive/2008/07/24/1250116.html [ArcGIS Server 开发系列]Flyingis六大系列讲座 ...
- android学习——必学基础组件
android基础组件是一个Android的开发人员必须要了解,且深刻理解的东西: 1.应用程序基础 2.应用程序组件 2.1.活动(Activities) 2.2.服务(Services) 2.3. ...
- Java基础—异常处理总结
异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地 ...
- HDU-1019 Least Common Multiple
http://acm.hdu.edu.cn/showproblem.php?pid=1019 Least Common Multiple Time Limit: 2000/1000 MS (Java/ ...
- 【转】qtp安装时问题
1.安装qtp后要重启机器. 2.插件选择错误, 处理方式:重新启动QTP,勾选 WEB插件; 3.在安装QTP后,或者禁用IE浏览器里的一些ActiveX控件后,正常录制QTP时,对象识别不了;(保 ...
- Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的
在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到Afinal框架,不会用Afinal的童鞋可以先看一下上一篇博文),正所谓麻雀虽小,五脏俱全,这在里我会尽量 ...