1. 程式人生 > >專案整理一:資料庫設計

專案整理一:資料庫設計

裝置管理平臺,支援不同裝置種類的管理,如蒸汽表、燃氣表、水錶等。為了滿足這種需求,資料庫設計時,對裝置資訊相關的表的屬性欄位採用的方式時:設定10個double column,10個int column,10個String column,5個date column,這由裝置基本資訊的資料型別決定的。還有一張欄位對映表column_map_info_t,即對於裝置資訊相關的表中的各個型別欄位具體表示的名稱和含義進行對映說明。
如device_info_t的doubleCol1欄位,在column_map_info_t這張表中通過tableName、columName和deviceType(表示不同的裝置型別),就找到了device_info_t的doubleCol1的具體描述,為瞬時流量。

運用反射
通過欄位名來獲取get方法

介面上的元件進行配置,如報表的表頭需要顯示瞬時流量、壓力、溫度、累計流量、壓差等,配置後,根據元件名稱、裝置型別和table_name到widget_map_info_t表中找到對應的欄位描述。通過欄位描述和table_name到column_map_info_t表中找到具體的欄位名。取得欄位名後,就可以通過反射來獲得get方法,
從而去到該欄位的值。
缺點:資料庫設計時要預留足夠欄位,無疑佔用了更多的空間。同時對資料庫的表進行操作時,需要先查詢對映表,才能得出具體的欄位資訊,I/O消耗增加。優點:可以對資訊進行配置,支援多種裝置的管理,能更好的滿足客戶的定製化需求。
優化:
這裡用HashMap把已經獲得欄位名和相應的get方法的對應關係存在記憶體中,避免多次查詢請求,減少消耗,加快速度。

public static Method getMethodByFieldName(Object obj,String filed){
        Class clazz = obj.getClass();
        String methodName = clazz.getName()+".get"+filed.replace(filed.substring(0, 1), filed.substring(0, 1).toUpperCase());
        LogUtils.info(methodName);
        if(methodHashMap.get(methodName)!=null
) return methodHashMap.get(methodName); PropertyDescriptor pd; try { pd = new PropertyDescriptor(filed,clazz); Method getMethod = pd.getReadMethod();//獲得get方法 methodHashMap.put(methodName, getMethod); return getMethod; } catch (IntrospectionException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }