這期內容當中小編將會給大家帶來有關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一致,不但能支持多種類型,還能做字段校驗等
上述就是小編為大家分享的Hibernate實現傳入Java對象創建動態表并錄入數據了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。