当前位置:首页 > 开发 > 编程语言 > Java > 正文

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

发表于: 2013-06-24   作者:cuisuqiang   来源:转载   浏览次数:
摘要: 看到Hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像Hibernate不能动态的分表创建表和录入数据 我这里写了一个公用的类,你给一个对象,告诉我按年还是按月生成表,并告诉我那个字段是不需要在表中创建的,该类就可以动态的分表创建需要的表,并录入数据 注意: 由于业务需要,这里对于字段的支持只有int和Integer,

看到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同步!

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1.数据库准备: CREATE DATABASE db_hibernate CHARACTER SET utf8; USE db_hibernate; -- 注释:用
之前我们介绍过在java中传入一些基本数据类型作为参数在jni中的处理,这里我们来介绍下载java中传入
前言 C#有关反射的话题已经是个老生常谈的话题,也许园友一看这标题都不屑去看了,但是既然拿出来讲
自ActionScript 3开始,eval函数就被取消了,这样就不能像原来那样利用字符串动态的创建对象了,但
自ActionScript 3开始,eval函数就被取消了,这样就不能像原来那样利用字符串动态的创建对象了,但
自ActionScript 3开始,eval函数就被取消了,这样就不能像原来那样利用字符串动态的创建对象了,但
在本地方法实现代码中创建java对象,其中还主要涉及到jni和java之间中文字符串的的乱码问题。 1.创
下面是利用SQL语句创建数据库、表、存储过程、视图、索引、规则、修改表、查看数据等的方法。所要增
在《Qt Quick 事件处理之信号与槽》一文中介绍自定义信号时,举了一个简单的例子,定义了一个颜色选
做了个简单使用JavaScript、JQuery、ExtJs进行DOM对象创建的测试,主要是使用JavaScript、JQuery、E
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号