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

 更新时间:2020年10月31日 12:03:02   作者:cuisuqiang  
这篇文章主要介绍了Hibernate传入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一致,不但能支持多种类型,还能做字段校验等

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于javassist进行动态编程过程解析

    基于javassist进行动态编程过程解析

    这篇文章主要介绍了基于javassist进行动态编程过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 利用Spring Cloud Zuul实现动态路由示例代码

    利用Spring Cloud Zuul实现动态路由示例代码

    Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。下面这篇文章主要给大家介绍了关于利用Spring Cloud Zuul实现动态路由的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 浅析springcloud 整合 zipkin-server 内存日志监控

    浅析springcloud 整合 zipkin-server 内存日志监控

    Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),其主要功能是聚集来自各个异构系统的实时监控数据。这篇文章主要介绍了springcloud 整合 zipkin-server 内存日志监控,需要的朋友可以参考下
    2019-11-11
  • java中int、double、char等变量的取值范围详析

    java中int、double、char等变量的取值范围详析

    这篇文章主要给大家介绍了关于java中int、double、char等变量取值范围的相关资料,每个变量都给出了详细的实例代码,对大家学习或者使用java具有一定的参考学习价值,需要的朋友可以参考下
    2021-10-10
  • SpringBoot的异常处理流程是什么样的?

    SpringBoot的异常处理流程是什么样的?

    今天给大家带来的是Java的相关知识,文章围绕着SpringBoot的异常处理流程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 让Java程序自动重启的实现方法(推荐)

    让Java程序自动重启的实现方法(推荐)

    下面小编就为大家带来一篇让Java程序自动重启的实现方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • springmvc集成shiro登录权限示例代码

    springmvc集成shiro登录权限示例代码

    本篇文章主要介绍了springmvc集成shiro登录权限示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java中getResourceAsStream用法分析

    Java中getResourceAsStream用法分析

    这篇文章主要介绍了Java中getResourceAsStream用法,较为详细的分析了getResourceAsStream的功能及用法,需要的朋友可以参考下
    2015-06-06
  • idea如何关闭页面显示的浏览器图标

    idea如何关闭页面显示的浏览器图标

    这篇文章主要介绍了idea如何关闭页面显示的浏览器图标问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java字节码中jvm实例用法

    Java字节码中jvm实例用法

    在本篇文章里小编给大家整理的是一篇关于Java字节码中jvm实例用法内容,有兴趣的朋友们可以学习参考下。
    2021-02-02

最新评论