傳入Java物件 自動建立動態表 並錄入資料
看到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
- 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一致,不但能支援多種型別,還能做欄位校驗等
相關推薦
傳入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同樣生