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

傳入Java物件 自動建立動態表 並錄入資料

看到Hibernate你給一個物件,他就能動態的建立配置檔案裡面指定的表名,然後把資料錄入到資料庫,當初感覺是很神奇,不過,好像Hibernate不能動態的分表建立表和錄入資料

我這裡寫了一個公用的類,你給一個物件,告訴我按年還是按月生成表,並告訴我那個欄位是不需要在表中建立的,該類就可以動態的分表建立需要的表,並錄入資料

注意:

由於業務需要,這裡對於欄位的支援只有int和Integer,double和Double

還有String,同時對於String統一建立為了Varchar(100)的欄位

表會統一建立一個id自增主鍵

Java程式碼  收藏程式碼
  1. package com.xd.nms.util;  
  2. import java.lang.reflect.Field;  
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7. import org.apache.commons.logging.Log;  
  8. import org.apache.commons.logging.LogFactory;  
  9. import org.springframework.jdbc.core.JdbcTemplate;  
  10. /** 
  11.  * @說明 動態插入資料和建立表
     
  12.  * @author 崔素強 
  13.  * @version 1.0 
  14.  * @since 
  15.  */  
  16. public class CommonTableInsert {  
  17.     public static Log logger = LogFactory.getLog(CommonTableInsert.class);  
  18.     /** 
  19.      * 入口方法 
  20.      * @param tableName 表字首 
  21.      * @param dateFormat 格式化方法 
  22.      * @param obj 儲存的物件 
  23.      * @return 
  24.      */  
  25.     @SuppressWarnings
    ("unchecked")  
  26.     public static int insertObject(String tableName,String dateFormat,Object obj, Map noCol){  
  27.         int re = 0;          
  28.         try {     
  29.             JdbcTemplate jt = (JdbcTemplate) SpringFactory.getObject("jdbcTemplate");  
  30.             SimpleDateFormat format = new SimpleDateFormat(dateFormat);               
  31.             String tname = tableName + "_" + format.format(new Date());  
  32.             if(CommonDBUtil.getAllTableName(jt,tname)){ // 如果有某表  
  33.                 re = saveObj(jt,tname,obj, noCol); // 儲存資料     
  34.             }else{  
  35.                 re = createTable(jt,tname,obj, noCol); // 動態建立表  
  36.                 if(re == 1){  
  37.                     re = saveObj(jt,tname,obj, noCol); // 儲存資料  
  38.                 }  
  39.             }                
  40.         } catch (Exception e) {     
  41.             logger.error("公用方法插入資料入口方法錯誤", e);  
  42.         }            
  43.         return re;     
  44.     }  
  45.     /**   
  46.      * 儲存方法,注意這裡傳遞的是實際的表的名稱   
  47.      */    
  48.     @SuppressWarnings("unchecked")  
  49.     private static int saveObj(JdbcTemplate jt,String tableName,Object obj, Map noCol){     
  50.         int re = 0;  
  51.         StringBuffer sb = new StringBuffer("");  
  52.         try{                 
  53.             sb.append(" insert into " + tableName + " (");     
  54.             Map<String,String> map = ObjectUtil.getProAndValMap(obj); // 物件的屬性和屬性值  
  55.             Map<String,String> mapType = ObjectUtil.getProTypeMap(obj); // 物件的屬性型別列表  
  56.             Set<String> set = map.keySet();     
  57.             for(String key : set){  
  58.                 // 如果該列不是 非處理列  
  59.                 if(noCol.get(key) == null){  
  60.                     sb.append(key + ",");  
  61.                 }  
  62.             }     
  63.             sb.append(" tableName ) ");                  
  64.             sb.append(" values ( ");     
  65.             for(String key : set){  
  66.                 if(noCol.get(key) == null){  
  67.                     if(mapType.get(key).equals("class java.lang.String")){  
  68.                         sb.append("'" + (map.get(key) + "',"));  
  69.                     }else{  
  70.                         sb.append(map.get(key) + ",");  
  71.                     }  
  72.                 }  
  73.             }     
  74.             sb.append("'" + tableName + "'); ");   
  75.             re = jt.update(sb.toString());             
  76.         } catch (Exception e) {     
  77.             logger.error("公用方法錄入資料時錯誤", e);  
  78.             logger.error("公用方法錄入資料語句:" + sb.toString());  
  79.         }            
  80.         return re;     
  81.     }  
  82.     /**   
  83.      * 根據表名稱 和 實體屬性 建立一張表 
  84.      * @param tableName   
  85.      * @param obj 具體生成什麼樣的表看該物件 
  86.      */    
  87.     @SuppressWarnings("unchecked")  
  88.     private static int createTable(JdbcTemplate jt,String tableName,Object obj, Map noCol){     
  89.         StringBuffer sb = new StringBuffer("");     
  90.         sb.append("CREATE TABLE `" + tableName + "` (");     
  91.         sb.append(" `id` int(11) NOT NULL AUTO_INCREMENT,");  
  92.         Class c = obj.getClass();  
  93.         Field field[] = c.getDeclaredFields();  
  94.         for (Field f : field) {  
  95.             if(noCol.get(f.getName()) == null){  
  96.                 String type = f.getType().toString();  
  97.                 if(type.equals("class java.lang.String")){// Str  
  98.                      sb.append("`" + f.getName() + "` varchar(100) DEFAULT NULL,");     
  99.                 }else if(type.equals("int") || type.equals("class java.lang.Integer")){// int  
  100.                     sb.append("`" + f.getName() + "` int(11) DEFAULT NULL,");     
  101.                 }else if(type.equals("double") || type.equals("class java.lang.Double")){// double  
  102.                     sb.append("`" + f.getName() + "` double DEFAULT NULL,");     
  103.                 }  
  104.             }  
  105.         }  
  106.         sb.append(" `tableName` varchar(255) DEFAULT NULL,");  
  107.         sb.append(" PRIMARY KEY (`id`)");     
  108.         sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");     
  109.         try {     
  110.             jt.update(sb.toString());     
  111.             return 1;     
  112.         } catch (Exception e) {  
  113.             logger.error("公用方法生成表時錯誤", e);  
  114.             logger.error("公用方法生成表語句:" + sb.toString());  
  115.         }     
  116.         return 0;     
  117.     }   
  118. }  

這個對於之前寫的那個動態建表,新增了過濾不需要在表中建立的欄位

原理就是讀取物件的各個欄位屬性,如果能加以配置檔案或者讀取物件屬性的標記,那其實能做到基本和Hibernate一致,不但能支援多種型別,還能做欄位校驗等 

相關推薦

傳入Java物件 自動建立動態 錄入資料

看到Hibernate你給一個物件,他就能動態的建立配置檔案裡面指定的表名,然後把資料錄入到資料庫,當初感覺是很神奇,不過,好像Hibernate不能動態的分表建立表和錄入資料 我這裡寫了一個公用的類,你給一個物件,告訴我按年還是按月生成表,並告訴我那個欄位是不需要在表

springBoot下java自動建立資料庫

####SpringBoot環境啟動專案建立資料庫表 ####使用環境 windows+eclipse+mysql+navicat ####步驟 1.建立SpringBoot專案 2.新建資料庫,配置連線資訊 3.編寫初始化資料庫表類 4.執行檢視結果 1.建立

JAVA實現建立Excel匯出

1.首先下載poi-3.6-20091214.jar,下載地址如下: 或者使用Maven倉庫管理,在pom檔案新增座標             <dependency>   <groupId>org.apache.poi</group

Java建立單鏈直接選擇排序輸出

RT 寫Java也一年左右了,第一次用Java寫單鏈表。。。 廢話少說,程式碼如下: import java.util.Scanner; public class Exp1 { public s

JdbcTemplate 動態建立新增資料

之前寫了一個 使用JDBC查詢是否存在某表或檢視,按月動態生成表 ,但是他並不能進行公用,使用時需要每個人都寫自己的處理程式碼,為了方便使用,我寫了一個公共的處理方法,僅供參考。 為了考慮大家專案的整合,獲得JdbcTemplate我採用Spring配置,也為了方便大

使用 JdbcTemplate 動態建立新增資料 動態查詢

我寫了這樣一個公共方法,僅供參考! 這裡需要傳遞兩個時間間隔引數,根據時間間隔判斷相差的月數,然後從起始時間開始遞增月份,然後動態拼裝表的名稱,如果存在該表則標記需要查詢 所有的SQL通過 union all 來連線,最後增加分頁的引數,分頁只適合MySQL資料庫 當然這個示例也只是適合於按月份來儲存

使用hibernate自動建立Mysql失敗原因及解決方法

原因: hibernate裡的dialect和Mysql的版本不匹配,SQL語句裡的type=“****”使用在MySQL5.0之前,5.0之後就要是使用engine=“****”。 解決: 修改hibernate.cfg.xml檔案 MySql5.0之前的配置 <property

python django建立資料庫連線mysql資料庫(附mysql 8.0.12安裝)

先寫下mysql zip安裝方式,在環境變數中加入mysql/bin路徑,把zip解壓到C:\program files下,在最外層資料夾建立my-default.ini 寫入內容: [mysqld]  basedir=C:\Program Files\MySQL data

建立單鏈原地將連結串列逆序

#include<iostream> #include<stdio.h> using namespace std; #define MAXSIZE 5 #define ERROR -1; #define CORRECT 1; typedef struct List{

jvm 複習概要(二) java 物件建立

1.物件的建立 按順序為: 1.給物件分配記憶體 2.初始化物件 3.執行構造方法 2.物件的結構 2.1 Header(物件頭)  -自身執行時的資料     --雜湊值  GC分帶年齡  鎖狀態標誌&nb

深入理解Java物件建立過程:類的初始化與例項化

摘要:   在Java中,一個物件在可以被使用之前必須要被正確地初始化,這一點是Java規範規定的。在例項化一個物件時,JVM首先會檢查相關型別是否已經載入並初始化,如果沒有,則JVM立即進行載入並呼叫類構造器完成類的初始化。在類初始化過程中或初始化完畢後,根據具體情況才會

ORACLE資料庫建立動態

最近公司一個專案程式碼裡的定時任務無法執行,查驗程式碼良久,奈何程式碼過於老舊,開發人員換了一茬又一茬,現在都無法理清,故無奈只好到資料庫裡重新寫存過,配置定時任務。 在寫存過時,由於檢測及安全效能要求,需要備份資料,設計是每次呼叫存過時就建立一張新表記錄歷史資料,開始時是準備直接一條語句搞定: BEGIN

python django建立資料庫連線mysql資料庫(附mysql安裝)

先寫下mysql zip安裝方式,在環境變數中加入mysql/bin路徑,把zip解壓到C:\program files下,在最外層資料夾建立my-default.ini 寫入內容: [mysqld]  basedir=C:\Program Files\MySQL d

從虛擬機器的角度看java物件建立

前言 建立物件有多種方式,最直觀的方式就是通過new關鍵字建立物件。通過new建立的物件儲存在java的堆中。 物件的建立過程 java建立過程要經過下圖的6個步驟,我們所能看到的是new 類名和呼叫物件的初始化方法,中間的四個是虛擬機器內部所執行的,對於開發者來講它遮

jpa在mysql中自動建立重複,只是大小寫不同

參考資料: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html http://www.alberton.info/dbms_identifiers_and_case_sens

建立單鏈找到中間數

題目:建立單鏈表並找到中間數 普通方法就是先遍歷一遍連結串列知道了單鏈表的長度N,然後再從頭找到N/2時候的數。這種方法時間複雜度為O(N+N/2)=O(3N/2)。 在優化一下這個方法,可以利用快慢指標,也就是設定兩個指標,然後快的一次移動兩個,慢的一次移動一個位置。總體程式碼(C語言):

Hive 建立外部分割槽載入資料以及如何分桶

第一  建立資料庫並自定義路徑 如 /sogou/500w         hive> create  database  sogou location '/sogou/500w' ;              進入改表中建立表        hive> use

解決Hibernate不能自動建立資料庫的問題

HibernateTest(測試類):package club.mochunrong.hibernate.test; import java.io.PrintStream; import club.mochunrong.hibernate.bean.User; impor

Jquery建立動態

$(document).ready(function(){ $("#button1").click(function(){ //獲取html <body></body>的Jquery物件 var body = $("body");

oracle按時間自動建立分割槽

首先明確分割槽表和表分割槽的區別:表分割槽是一種思想,分割槽表示一種技術實現。當表的大小過G的時候可以考慮進行表分割槽,提高查詢效率,均衡IO。oracle分割槽表是oracle資料庫提供的一種表分割槽的實現形式。表進行分割槽後,邏輯上仍然是一張表,原來的查詢SQL同樣生