看到Hibernate你給一個對象,他就能動態建立設定檔裡面指定的表名,然後把資料錄入到資料庫,當初感覺是很神奇,不過,好像Hibernate不能動態分表建立表和錄入資料
我這裡寫了一個公用的類,你給一個對象,告訴我按年還是按月產生表,並告訴我那個欄位是不需要在表中建立的,該類就可以動態分表建立需要的表,並錄入資料
注意:
由於業務需要,這裡對於欄位的支援只有int和Integer,double和Double
還有String,同時對於String統一建立為了Varchar(100)的欄位
表會統一建立一個id自增主鍵
Java代碼 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 +