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

传入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意义会大一点吧

相关推荐

    java对象创建过程

    因此,在创建任何对象之前,Java虚拟机(JVM)必须先找到对应的类文件(`.class` 文件),并将其加载到内存中。这个过程称为类加载,主要包括三个阶段: 1. **加载(Loading)**:查找并加载类的二进制数据。JVM会...

    java-生成单表完全动态查询

    总结起来,“java-生成单表完全动态查询”是一种优化开发流程的技术,它利用Java和MyBatis的特性,自动创建实体类和DAO层,并支持根据参数动态生成查询SQL,以提高开发效率和代码的可维护性。在项目中引入这样的工具...

    PB动态数据窗口及数据存储对象

    创建动态数据窗口通常包括以下步骤: 1. **预置数据窗口控件**:首先在窗口设计阶段,我们需要放置一个数据窗口控件,但不会预先定义其数据源,这个控件将用来显示我们动态创建的数据窗口。 2. **构造SQL语句**:...

    EasyExcel 动态表头 导出

    5. **导出数据**:最后,调用`doWrite`方法,传入需要导出的数据列表,EasyExcel会自动处理数据并生成Excel文件。 EasyExcel的动态表头导出功能,结合其强大的数据处理能力和灵活性,使得在处理复杂Excel导出场景时...

    fastreport web 动态传入数据

    在Web环境下,FastReport提供了动态传入数据的功能,使得用户可以在运行时根据需要从各种来源(如数据库、XML、JSON等)获取并填充报表数据,无需预先设置或绑定到特定的数据库。这种灵活性使得FastReport成为企业级...

    xml和java对象互转

    Java作为一种强类型、面向对象的编程语言,有时需要将XML数据转换为Java对象,或者将Java对象转换为XML格式的数据,以实现数据的序列化和反序列化。这种转换过程对于数据交换和持久化至关重要。 在Java中,XStream...

    xml转换java对象

    2. **读取XML到Java对象**: 创建一个`XmlMapper`对象,然后调用`bindMapToReader()`或`bindMapToInputStream()`方法,传入XML文件的输入源和之前配置的映射。这会将XML数据解析成Java对象。 3. **Java对象到XML**: ...

    easyexcel 动态导出复杂表头.zip

    "动态导出复杂表头"意味着在导出Excel时,表头可以根据程序运行时的数据结构自动生成,而不是在编写代码时硬编码。这在处理数据模型复杂多变的场景下非常有用。 压缩包中的`ExportUtilsTests.java`很可能是测试类,...

    java元数据——CLass类

    Class对象的创建发生在类加载(java.lang.ClassLoader)的时候,JVM加载一个类的时候首先创建Class对象,然后创建这个类的每个实例的时候都使用这个Class对象。 Class对象的作用是: 1. JAVA 使用 Class 对象来...

    Java编程中对象的创建与使用以及方法的重构与重载的区别说明

    Java会根据传入的参数类型和数量自动选择合适的方法。 重载的规则包括: - 方法名必须相同。 - 参数列表必须不同(类型、数量或顺序不同)。 示例: ```java public class Example { public void display(int a)...

    java 将由键盘中录入的信息保存到文件中

    在Java编程语言中,将由键盘输入的数据保存到文件中是一项基本操作,这对于数据存储、日志记录等应用场景至关重要。本篇文章将详细讲解如何在Java中实现这一功能,主要涉及IO流(Input/Output Stream)的使用。 ...

    C#使用存储过程录入数据

    如果存储过程中有输入参数,我们需要创建对应的`SqlParameter`对象并添加到`SqlCommand`的`Parameters`集合中。例如,如果存储过程接受两个参数`@param1`和`@param2`: ```csharp command.Parameters.Add(new Sql...

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

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

    java调用C++编写的动态库dll

    3. **创建动态库DLL** 使用Visual Studio 2013或其他C++编译器,将C++代码编译为动态库。在VS2013中,创建一个新的Win32控制台项目,添加源代码文件,然后设置生成动态库的目标。 4. **链接动态库** 将生成的DLL...

    json转对象(java 多级嵌套)

    总结,Java中处理JSON到对象的转换,特别是面对多级嵌套的情况,关键在于理解JSON结构并构建相应的Java对象模型,然后利用如Jackson这样的库进行数据映射。通过熟练掌握这些工具和技巧,可以有效地在Java应用中处理...

    java操作数据库

    - **Statement对象**:创建`Statement`对象,用于执行SQL查询和更新语句。例如,执行查询语句: ```java String sql = "SELECT * FROM table"; Statement stat = conn.createStatement(); ResultSet rs = stat....

    JAVA WEB实现echarts动态图表实例.zip

    5. 渲染图表:当从服务器获取到数据后,更新配置项并调用`setOption`,ECharts会自动重新绘制图表。 在服务器端,Java代码可能通过JDBC连接到MySQL数据库,执行SQL查询获取`bar`表中的数据。然后,将数据转化为JSON...

    jspoon是一个Java库它基于CSS选择器提供将Java解析为Java对象

    2. **创建模型类**:定义Java类并使用注解标记需要从HTML中提取的数据。 3. **编写转换代码**:使用`Jspoon`类的实例化方法,如`create()`,并传入HTML文档的URL或字符串。 4. **执行解析**:调用`process()`方法...

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

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

Global site tag (gtag.js) - Google Analytics