1. 程式人生 > 程式設計 >Hibernate傳入Java物件建立動態表並錄入資料

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,noCol); // 動態建立表 
        if(re == 1){ 
          re = saveObj(jt,noCol); // 儲存資料 
        } 
      }        
    } catch (Exception e) {   
      logger.error("公用方法插入資料入口方法錯誤",e); 
    }      
    return re;   
  } 
  /**  
   * 儲存方法,注意這裡傳遞的是實際的表的名稱  
   */  
  @SuppressWarnings("unchecked") 
  private static int saveObj(JdbcTemplate jt,String tableName,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,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一致,不但能支援多種型別,還能做欄位校驗等

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。