看到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同步!
相关推荐
SpringBoot 整合Mybatis 创建临时表
fastreport.net web 动态传入数据,与数据库无关
传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并执行 * 8.获取执行完成后的返回JavaClassObject类 * 9.创建DynamicClassLoader来...
答:将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] 为什么用它? 答:我数据库中的主键是使用雪花算法生成的,就是因为用id的位数太多,导致在...
java代码,获取文件创建时间,传入文件路径,得到创建时间
将java对象list或者map转json数据不需要第三方包,直接使用就可以了,如果你传入的数据不确定是map类型还是list类型,那么自己处理一下就可以了(判断下类型,传入参数改为object)。 如果是json数据转成java对象list...
java采用面向对象编程方法实现一个简单的计算器,完成两个整数的加、减、乘、除运算。参与运算的两个整数及运算符从命令行参数传入。.txt
mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象指针 mfc使用回调函数(系统api)并传入对象...
用途:根据PDF模板生成PDF文件,将数据库查询的数据插入到模板指定未知,然后生成新的PDF文件 原理: 代码说明:exprotPDF_Main 为主文件。...支持各种java调用数据库数据,生成PDF文件。多个版本供参考。
具体讲解了java数据库操作基本流程
java数据格式化 精华
本人以JAVA来实现以支付宝的账单表为例,实现JAVA读取CSV..csv是一种文件格式(如.txt、.doc等),也可理解.csv文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间已英文字符的逗号或制表符(Tab)分隔。
Java调用存储过程--传入集合参数 具体的方法描述分析
创建()”方法创建Java虚拟机,以传入相关路径参数。本支持库要求目标机器中已安装“Java运行时环境”(JRE)。如果在没有配置好Java环境的情况下使用本支持库,所有对象方法都将返回空值(假,0,“”)。本支持库...
Java海量数据分页Bean, 适用于Oracle(适当修改,适用于任何数据库).功能描述:传入到达页码(具有容错性)、每页记录数、Select查询语句,返回该页所有的记录(整页是List集合,每条记录是一个 HashMap)、总行数、总...
创建()”方法创建Java虚拟机,以传入相关路径参数。本支持库要求目标机器中已安装“Java运行时环境”(JRE)。如果在没有配置好Java环境的情况下使用本支持库,所有对象方法都将返回空值(假,0,“”)。本支持库...
类是创建对象的模板,我们可以将类比作一个蓝图,它描述了如何创建具有特定属性和行为的对象。 2. 属性(Attributes):在上述代码中,HeadSong类具有三个属性:title、artist和duration。这些属性分别表示歌曲的...
Python实现EXCEL图标自动生成OpenPyXL支持使用工作表单元格中的数据创建条形图,折线图,散点图和饼图。要制作图表,您需要执行以下操作:1. Reference从矩形选择的单元格创建对象。2. Series通过传入对象来创建...
json-rpc-for-java,是仅仅不到100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持级联调用,也就是说不需要额外 的JavaScript编程,...
JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作中。例如使用Map对象要...