`
cuisuqiang
  • 浏览: 3937658 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3651947
社区版块
存档分类
最新评论

传入Java对象 自动创建动态表 并录入数据

阅读更多

看到Hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像Hibernate不能动态的分表创建表和录入数据

我这里写了一个公用的类,你给一个对象,告诉我按年还是按月生成表,并告诉我那个字段是不需要在表中创建的,该类就可以动态的分表创建需要的表,并录入数据

注意:

由于业务需要,这里对于字段的支持只有int和Integer,double和Double

还有String,同时对于String统一创建为了Varchar(100)的字段

表会统一创建一个id自增主键

 

package com.xd.nms.util;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
/**
 * @说明 动态插入数据和创建表
 * @author 崔素强
 * @version 1.0
 * @since
 */
public class CommonTableInsert {
	public static Log logger = LogFactory.getLog(CommonTableInsert.class);
	/**
	 * 入口方法
	 * @param tableName 表前缀
	 * @param dateFormat 格式化方法
	 * @param obj 保存的对象
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static int insertObject(String tableName,String dateFormat,Object obj, Map noCol){
        int re = 0;        
        try {   
        	JdbcTemplate jt = (JdbcTemplate) SpringFactory.getObject("jdbcTemplate");
            SimpleDateFormat format = new SimpleDateFormat(dateFormat);             
            String tname = tableName + "_" + format.format(new Date());
            if(CommonDBUtil.getAllTableName(jt,tname)){ // 如果有某表
                re = saveObj(jt,tname,obj, noCol); // 保存数据   
            }else{
                re = createTable(jt,tname,obj, noCol); // 动态创建表
                if(re == 1){
	                re = saveObj(jt,tname,obj, noCol); // 保存数据
                }
            }              
        } catch (Exception e) {   
        	logger.error("公用方法插入数据入口方法错误", e);
        }          
        return re;   
    }
    /**  
     * 保存方法,注意这里传递的是实际的表的名称  
     */  
    @SuppressWarnings("unchecked")
	private static int saveObj(JdbcTemplate jt,String tableName,Object obj, Map noCol){   
        int re = 0;
        StringBuffer sb = new StringBuffer("");
        try{               
        	sb.append(" insert into " + tableName + " (");   
            Map<String,String> map = ObjectUtil.getProAndValMap(obj); // 对象的属性和属性值
            Map<String,String> mapType = ObjectUtil.getProTypeMap(obj); // 对象的属性类型列表
            Set<String> set = map.keySet();   
            for(String key : set){
            	// 如果该列不是 非处理列
            	if(noCol.get(key) == null){
            		sb.append(key + ",");
            	}
            }   
            sb.append(" tableName ) ");                
            sb.append(" values ( ");   
            for(String key : set){
            	if(noCol.get(key) == null){
            		if(mapType.get(key).equals("class java.lang.String")){
            			sb.append("'" + (map.get(key) + "',"));
            		}else{
            			sb.append(map.get(key) + ",");
            		}
            	}
            }   
            sb.append("'" + tableName + "'); "); 
            re = jt.update(sb.toString());           
        } catch (Exception e) {   
        	logger.error("公用方法录入数据时错误", e);
        	logger.error("公用方法录入数据语句:" + sb.toString());
        }          
        return re;   
    }
    /**  
     * 根据表名称 和 实体属性 创建一张表
     * @param tableName  
     * @param obj 具体生成什么样的表看该对象
     */  
    @SuppressWarnings("unchecked")
	private static int createTable(JdbcTemplate jt,String tableName,Object obj, Map noCol){   
        StringBuffer sb = new StringBuffer("");   
        sb.append("CREATE TABLE `" + tableName + "` (");   
        sb.append(" `id` int(11) NOT NULL AUTO_INCREMENT,");
        Class c = obj.getClass();
		Field field[] = c.getDeclaredFields();
		for (Field f : field) {
			if(noCol.get(f.getName()) == null){
				String type = f.getType().toString();
				if(type.equals("class java.lang.String")){// Str
					 sb.append("`" + f.getName() + "` varchar(100) DEFAULT NULL,");   
				}else if(type.equals("int") || type.equals("class java.lang.Integer")){// int
					sb.append("`" + f.getName() + "` int(11) DEFAULT NULL,");   
				}else if(type.equals("double") || type.equals("class java.lang.Double")){// double
					sb.append("`" + f.getName() + "` double DEFAULT NULL,");   
				}
			}
		}
		sb.append(" `tableName` varchar(255) DEFAULT NULL,");
        sb.append(" PRIMARY KEY (`id`)");   
        sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");   
        try {   
            jt.update(sb.toString());   
            return 1;   
        } catch (Exception e) {
        	logger.error("公用方法生成表时错误", e);
        	logger.error("公用方法生成表语句:" + sb.toString());
        }   
        return 0;   
    } 
}

 

这个对于之前写的那个动态建表,新增了过滤不需要在表中创建的字段

原理就是读取对象的各个字段属性,如果能加以配置文件或者读取对象属性的标记,那其实能做到基本和Hibernate一致,不但能支持多种类型,还能做字段校验等 

 

请您到ITEYE网站看原创,谢谢!

http://cuisuqiang.iteye.com/ ! 

 自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

7
4
分享到:
评论
4 楼 sp42 2015-08-09  
谢谢 已收
3 楼 yixiandave 2013-06-25  
cuisuqiang 写道
yixiandave 写道
好偏门的需求。。传统关系型数据库如果使用过程中还需要创建表的话一定是数据库设计有问题了。

对于NoSQL意义会大一点吧

yixiandave 写道
好偏门的需求。。传统关系型数据库如果使用过程中还需要创建表的话一定是数据库设计有问题了。

对于NoSQL意义会大一点吧

我说的是Hibernate的反转生成数据库,开发时使用很多

了解
2 楼 cuisuqiang 2013-06-25  
yixiandave 写道
好偏门的需求。。传统关系型数据库如果使用过程中还需要创建表的话一定是数据库设计有问题了。

对于NoSQL意义会大一点吧

yixiandave 写道
好偏门的需求。。传统关系型数据库如果使用过程中还需要创建表的话一定是数据库设计有问题了。

对于NoSQL意义会大一点吧

我说的是Hibernate的反转生成数据库,开发时使用很多
1 楼 yixiandave 2013-06-25  
好偏门的需求。。传统关系型数据库如果使用过程中还需要创建表的话一定是数据库设计有问题了。

对于NoSQL意义会大一点吧

相关推荐

    SpringBoot 整合Mybatis 创建临时表

    SpringBoot 整合Mybatis 创建临时表

    fastreport web 动态传入数据

    fastreport.net web 动态传入数据,与数据库无关

    Java动态编译Java代码,运行在内存中,并执行

    传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并执行 * 8.获取执行完成后的返回JavaClassObject类 * 9.创建DynamicClassLoader来...

    java对象映射器(基于jackson将Java对象转为json,或者将json转为Java对象)

    答:将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] 为什么用它? 答:我数据库中的主键是使用雪花算法生成的,就是因为用id的位数太多,导致在...

    java获取文件创建时间

    java代码,获取文件创建时间,传入文件路径,得到创建时间

    Java List或Map对象和json字符串数据的相互转化

    将java对象list或者map转json数据不需要第三方包,直接使用就可以了,如果你传入的数据不确定是map类型还是list类型,那么自己处理一下就可以了(判断下类型,传入参数改为object)。 如果是json数据转成java对象list...

    面向对象计算器命令行参数传入

    java采用面向对象编程方法实现一个简单的计算器,完成两个整数的加、减、乘、除运算。参与运算的两个整数及运算符从命令行参数传入。.txt

    mfc使用回调函数(系统api)并传入对象指针

    mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象...

    java根据PDF模板自动生成PDF文件

    用途:根据PDF模板生成PDF文件,将数据库查询的数据插入到模板指定未知,然后生成新的PDF文件 原理: 代码说明:exprotPDF_Main 为主文件。...支持各种java调用数据库数据,生成PDF文件。多个版本供参考。

    java操作数据库

    具体讲解了java数据库操作基本流程

    java数据格式化

    java数据格式化 精华

    JAVA读取CSV到数据库表中

    本人以JAVA来实现以支付宝的账单表为例,实现JAVA读取CSV..csv是一种文件格式(如.txt、.doc等),也可理解.csv文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间已英文字符的逗号或制表符(Tab)分隔。

    Java调用存储过程--传入集合参数

    Java调用存储过程--传入集合参数 具体的方法描述分析

    Java支持库2.0#0版

    创建()”方法创建Java虚拟机,以传入相关路径参数。本支持库要求目标机器中已安装“Java运行时环境”(JRE)。如果在没有配置好Java环境的情况下使用本支持库,所有对象方法都将返回空值(假,0,“”)。本支持库...

    Java海量数据分页Bean

    Java海量数据分页Bean, 适用于Oracle(适当修改,适用于任何数据库).功能描述:传入到达页码(具有容错性)、每页记录数、Select查询语句,返回该页所有的记录(整页是List集合,每条记录是一个 HashMap)、总行数、总...

    Java支持库2.0#0版(静态版)

    创建()”方法创建Java虚拟机,以传入相关路径参数。本支持库要求目标机器中已安装“Java运行时环境”(JRE)。如果在没有配置好Java环境的情况下使用本支持库,所有对象方法都将返回空值(假,0,“”)。本支持库...

    头歌java面向对象答案.pdf

    类是创建对象的模板,我们可以将类比作一个蓝图,它描述了如何创建具有特定属性和行为的对象。 2. 属性(Attributes):在上述代码中,HeadSong类具有三个属性:title、artist和duration。这些属性分别表示歌曲的...

    Python实现EXCEL图标自动生成OpenPyXL支持使用工作表单元格中的数据创建条形图,折线图,散点图和饼图

    Python实现EXCEL图标自动生成OpenPyXL支持使用工作表单元格中的数据创建条形图,折线图,散点图和饼图。要制作图表,您需要执行以下操作:1. Reference从矩形选择的单元格创建对象。2. Series通过传入对象来创建...

    Json-RPC for java Example

    json-rpc-for-java,是仅仅不到100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持级联调用,也就是说不需要额外 的JavaScript编程,...

    JAVA的常用类

    JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作中。例如使用Map对象要...

Global site tag (gtag.js) - Google Analytics