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 ...
随机推荐
- 转载:win7JDK环境配置
[win7JDK环境配置] 网址:http://blog.sina.com.cn/s/blog_6a9df2330100ms9q.html 系统变量下: (1) 新建->变量名:JAVA_HOM ...
- java 全角半角转换函数
/** * 半角转全角 * @param input String. * @return 全角字符串. */ public static String ToSBC(String input) { ch ...
- Android——监听开机启动,自启动应用程序
1.首先继承一个broadcastreceiver public class ConnectBroadCastReceiver extends BroadcastReceiver { @Overrid ...
- ASP.NET使用EasyUI-DataGrid + ashx + JQuery Ajax:实现数据的增删查改,查询和分页!
转自:http://www.cnblogs.com/lt-style/p/3457399.html 数据表: 学生表:学生编号.姓名.性别.班级编号.年龄 班级表:班级编号.班级名称 开发过程: 1. ...
- strcmp函数实现及分析
最近看C,看到strcmp函数,对它的实现原型不很清楚,于是到网上搜.网上算法一大堆,看了很多代码后自己做了一下总结 strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果 ...
- Web前端常见问题处理
1. 浏览器后退按钮 这个在注册或者登陆的时候是一个普遍的问题,登陆之后,跳转到另外一个页面,我的鼠标有两个侧键,是用于前进和后退的,有时候会误点侧键,这个时候页面又会回到之前的登录页面,但事实是用户 ...
- HTML5 UTF-8 中文乱码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- MediaInfo源代码分析 2:API函数
本文主要分析MediaInfo的API函数.它的API函数位于MediaInfo.h文件中的一个叫做MediaInfo的类中. 该类如下所示,部分重要的方法已经加上了注释: //MediaInfo类 ...
- 普通身份运行Tomcat
普通身份运行Tomcat 转载1 权限分配问题 su - username -c “command”这样的形式可以使用任意一个有执行权限的用户执行 -c后边的命令. 注意,- username中间 ...
- centos防火墙操作
centos防火墙基本操作 #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT#/sbin/iptables -I INPUT -p tcp -- ...