欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-10 09:02:56
看到hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像hibernate不能动态的分表创建表和录入数据我这里写了一个公用的类,...

看到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一致,不但能支持多种类型,还能做字段校验等

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