看到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虚拟机(JVM)必须先找到对应的类文件(`.class` 文件),并将其加载到内存中。这个过程称为类加载,主要包括三个阶段: 1. **加载(Loading)**:查找并加载类的二进制数据。JVM会...
总结起来,“java-生成单表完全动态查询”是一种优化开发流程的技术,它利用Java和MyBatis的特性,自动创建实体类和DAO层,并支持根据参数动态生成查询SQL,以提高开发效率和代码的可维护性。在项目中引入这样的工具...
创建动态数据窗口通常包括以下步骤: 1. **预置数据窗口控件**:首先在窗口设计阶段,我们需要放置一个数据窗口控件,但不会预先定义其数据源,这个控件将用来显示我们动态创建的数据窗口。 2. **构造SQL语句**:...
5. **导出数据**:最后,调用`doWrite`方法,传入需要导出的数据列表,EasyExcel会自动处理数据并生成Excel文件。 EasyExcel的动态表头导出功能,结合其强大的数据处理能力和灵活性,使得在处理复杂Excel导出场景时...
在Web环境下,FastReport提供了动态传入数据的功能,使得用户可以在运行时根据需要从各种来源(如数据库、XML、JSON等)获取并填充报表数据,无需预先设置或绑定到特定的数据库。这种灵活性使得FastReport成为企业级...
Java作为一种强类型、面向对象的编程语言,有时需要将XML数据转换为Java对象,或者将Java对象转换为XML格式的数据,以实现数据的序列化和反序列化。这种转换过程对于数据交换和持久化至关重要。 在Java中,XStream...
2. **读取XML到Java对象**: 创建一个`XmlMapper`对象,然后调用`bindMapToReader()`或`bindMapToInputStream()`方法,传入XML文件的输入源和之前配置的映射。这会将XML数据解析成Java对象。 3. **Java对象到XML**: ...
"动态导出复杂表头"意味着在导出Excel时,表头可以根据程序运行时的数据结构自动生成,而不是在编写代码时硬编码。这在处理数据模型复杂多变的场景下非常有用。 压缩包中的`ExportUtilsTests.java`很可能是测试类,...
Class对象的创建发生在类加载(java.lang.ClassLoader)的时候,JVM加载一个类的时候首先创建Class对象,然后创建这个类的每个实例的时候都使用这个Class对象。 Class对象的作用是: 1. JAVA 使用 Class 对象来...
Java会根据传入的参数类型和数量自动选择合适的方法。 重载的规则包括: - 方法名必须相同。 - 参数列表必须不同(类型、数量或顺序不同)。 示例: ```java public class Example { public void display(int a)...
在Java编程语言中,将由键盘输入的数据保存到文件中是一项基本操作,这对于数据存储、日志记录等应用场景至关重要。本篇文章将详细讲解如何在Java中实现这一功能,主要涉及IO流(Input/Output Stream)的使用。 ...
如果存储过程中有输入参数,我们需要创建对应的`SqlParameter`对象并添加到`SqlCommand`的`Parameters`集合中。例如,如果存储过程接受两个参数`@param1`和`@param2`: ```csharp command.Parameters.Add(new Sql...
传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并执行 * 8.获取执行完成后的返回JavaClassObject类 * 9.创建DynamicClassLoader来...
3. **创建动态库DLL** 使用Visual Studio 2013或其他C++编译器,将C++代码编译为动态库。在VS2013中,创建一个新的Win32控制台项目,添加源代码文件,然后设置生成动态库的目标。 4. **链接动态库** 将生成的DLL...
总结,Java中处理JSON到对象的转换,特别是面对多级嵌套的情况,关键在于理解JSON结构并构建相应的Java对象模型,然后利用如Jackson这样的库进行数据映射。通过熟练掌握这些工具和技巧,可以有效地在Java应用中处理...
- **Statement对象**:创建`Statement`对象,用于执行SQL查询和更新语句。例如,执行查询语句: ```java String sql = "SELECT * FROM table"; Statement stat = conn.createStatement(); ResultSet rs = stat....
5. 渲染图表:当从服务器获取到数据后,更新配置项并调用`setOption`,ECharts会自动重新绘制图表。 在服务器端,Java代码可能通过JDBC连接到MySQL数据库,执行SQL查询获取`bar`表中的数据。然后,将数据转化为JSON...
2. **创建模型类**:定义Java类并使用注解标记需要从HTML中提取的数据。 3. **编写转换代码**:使用`Jspoon`类的实例化方法,如`create()`,并传入HTML文档的URL或字符串。 4. **执行解析**:调用`process()`方法...
答:将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] 为什么用它? 答:我数据库中的主键是使用雪花算法生成的,就是因为用id的位数太多,导致在...