Hibernate傳入Java對象創(chuàng)建動態(tài)表并錄入數(shù)據(jù)
看到Hibernate你給一個對象,他就能動態(tài)的創(chuàng)建配置文件里面指定的表名,然后把數(shù)據(jù)錄入到數(shù)據(jù)庫,當(dāng)初感覺是很神奇,不過,好像Hibernate不能動態(tài)的分表創(chuàng)建表和錄入數(shù)據(jù)
我這里寫了一個公用的類,你給一個對象,告訴我按年還是按月生成表,并告訴我那個字段是不需要在表中創(chuàng)建的,該類就可以動態(tài)的分表創(chuàng)建需要的表,并錄入數(shù)據(jù)
注意:
由于業(yè)務(wù)需要,這里對于字段的支持只有int和Integer,double和Double
還有String,同時對于String統(tǒng)一創(chuàng)建為了Varchar(100)的字段
表會統(tǒng)一創(chuàng)建一個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; /** * @說明 動態(tài)插入數(shù)據(jù)和創(chuàng)建表 * @author 崔素強(qiáng) * @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); // 保存數(shù)據(jù) }else{ re = createTable(jt,tname,obj, noCol); // 動態(tài)創(chuàng)建表 if(re == 1){ re = saveObj(jt,tname,obj, noCol); // 保存數(shù)據(jù) } } } catch (Exception e) { logger.error("公用方法插入數(shù)據(jù)入口方法錯誤", e); } return re; } /** * 保存方法,注意這里傳遞的是實(shí)際的表的名稱 */ @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("公用方法錄入數(shù)據(jù)時錯誤", e); logger.error("公用方法錄入數(shù)據(jù)語句:" + sb.toString()); } return re; } /** * 根據(jù)表名稱 和 實(shí)體屬性 創(chuàng)建一張表 * @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; } }
這個對于之前寫的那個動態(tài)建表,新增了過濾不需要在表中創(chuàng)建的字段
原理就是讀取對象的各個字段屬性,如果能加以配置文件或者讀取對象屬性的標(biāo)記,那其實(shí)能做到基本和Hibernate一致,不但能支持多種類型,還能做字段校驗(yàn)等
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于javassist進(jìn)行動態(tài)編程過程解析
這篇文章主要介紹了基于javassist進(jìn)行動態(tài)編程過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05利用Spring Cloud Zuul實(shí)現(xiàn)動態(tài)路由示例代碼
Spring Cloud Zuul路由是微服務(wù)架構(gòu)的不可或缺的一部分,提供動態(tài)路由,監(jiān)控,彈性,安全等的邊緣服務(wù)。下面這篇文章主要給大家介紹了關(guān)于利用Spring Cloud Zuul實(shí)現(xiàn)動態(tài)路由的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09淺析springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控
Zipkin是一款開源的分布式實(shí)時數(shù)據(jù)追蹤系統(tǒng)(Distributed Tracking System),其主要功能是聚集來自各個異構(gòu)系統(tǒng)的實(shí)時監(jiān)控數(shù)據(jù)。這篇文章主要介紹了springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控,需要的朋友可以參考下2019-11-11java中int、double、char等變量的取值范圍詳析
這篇文章主要給大家介紹了關(guān)于java中int、double、char等變量取值范圍的相關(guān)資料,每個變量都給出了詳細(xì)的實(shí)例代碼,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-10-10讓Java程序自動重啟的實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄孞ava程序自動重啟的實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03springmvc集成shiro登錄權(quán)限示例代碼
本篇文章主要介紹了springmvc集成shiro登錄權(quán)限示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Java中g(shù)etResourceAsStream用法分析
這篇文章主要介紹了Java中g(shù)etResourceAsStream用法,較為詳細(xì)的分析了getResourceAsStream的功能及用法,需要的朋友可以參考下2015-06-06idea如何關(guān)閉頁面顯示的瀏覽器圖標(biāo)
這篇文章主要介紹了idea如何關(guān)閉頁面顯示的瀏覽器圖標(biāo)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07