jfinal的Model對象與javaBean相互轉換java
javaBean==>Modelsql
1.首先定義註解類,類的變量定義fieldName表示對應於數據庫的字段名稱,在javaBean中成員變量定義是使用該註解字段數據庫
2.利用反射機制獲取到定義的數據庫字段名(即上一步定義的fieldName)和字段的額value,將名稱set到Model中oracle
model.set(fieldName,fieldValue);學習
3.調用Model的成員方法 model.sava();測試
Model==>javaBeanspa
1.原理與 javaBean==>Model大體相同,一樣先利用反射獲取javaBean中定義的變量名稱variablecode
2.使用Model的方法model.get(variable)獲取到數據庫中對應列的值,固然這其中須要一些類型判斷對象
3.將值set到javaBean中()返回ip
package com.fitc.common.jfinal.db; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * *@description:定義javabean 字段與數據字段的對應關係註解 * */ @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface JFinalTableColumnAnnotation { //對應數據庫的字段名稱 String fieldName(); //是不是主鍵字段 boolean isPrimaryKey() default false; //序列名稱 String sequenceName() default ""; //是否能夠更新 boolean canUpdate() default true; //是或否 String[] yesOrNo() default {}; }
package com.fitc.soldier.cph.common.db.entity; import java.util.Date; import com.fitc.common.jfinal.db.JFinalTableColumnAnnotation; /** * 實體Bean,這裏使用簡歷的實體bean,儘可能用到常見的幾種數據類型 * * @author Administrator * */ public class Resume implements Serializable { /** * */ private static final long serialVersionUID = 1L; /** * 簡歷表主鍵ID,使用JFinalTableColumnAnnotation註解類,定義javaBean字段與數據庫字段的映射關係 */ @JFinalTableColumnAnnotation(fieldName = "OBJ_ID", canUpdate = true, isPrimaryKey = true, sequenceName = "soldier_o.SEQ_JB_CV") private Long objId; /** * 薪水 */ @JFinalTableColumnAnnotation(fieldName = "SALARY") private Long salary; /** * 簡歷狀態(Y,公開;N,保密) */ @JFinalTableColumnAnnotation(fieldName = "STATUS", yesOrNo = { "Y", "N" }) protected boolean status = true; /** * 建立人 */ @JFinalTableColumnAnnotation(fieldName = "CREATE_USER") private String createUser; /** * 更新人 */ @JFinalTableColumnAnnotation(fieldName = "UPDATE_USER") private String updateUser; /** * 建立記錄時間 */ @JFinalTableColumnAnnotation(fieldName = "CREATE_DATE", canUpdate = false) protected Date createDate = new Date(System.currentTimeMillis()); //********因爲篇幅緣由省略掉自動生成的get/set 方法 // void set(...)/result_type get(...) }
/** * 將Jfinal的Model對象轉換成常見的JavaBean Model==>JavaBean 2018年4月10日 下午2:18:10 * @param:model * @param:targetBean * 主體思路:field.set(targetBean, model.get(field.getAnnotation(JFinalTableColumnAnnotation.class).fieldName)); */ @SuppressWarnings("rawtypes") public static <T> T modelToBean(Model<?> model, Class<T> targetBean) { T target = null; try { if (null != model) { Class _target = targetBean; target = targetBean.newInstance(); Field[] declaredFields = targetBean.getDeclaredFields();//反射獲取聲明的字段 do { for (Field field : declaredFields) { field.setAccessible(true); setBeanValue(model, field, target);// 將model中的屬相值set到javaBean中 } _target = _target.getSuperclass(); } while (!_target.getName().equals(Object.class.getName())); } } catch (Exception e) { e.printStackTrace(); } return target; }
其中的setBeanValue()方法爲屬相賦值
/** * 將model中的屬相及值set到javaBean中去 * * @param model:源; * @param field:javaBean中的字段 * @param javaBean * 目標Bean * @throws IllegalAccessException * @throws IllegalArgumentException * @throws SQLException */ private static void setBeanValue(Model<?> model, Field field, Object object) throws IllegalArgumentException, IllegalAccessException, SQLException { // 字段類型 Class<?> fieldType = field.getType(); // 字段上的註解 JFinalTableColumnAnnotation annotation = field.getAnnotation(JFinalTableColumnAnnotation.class); if (null != annotation) { String fieldName = annotation.fieldName(); Object value = model.get(fieldName); if (null != value) { if (fieldType.isAssignableFrom(String.class)) { field.set(object, value); } else if (fieldType.isAssignableFrom(Long.class) || fieldType.getName().equals("long")) {// 若是字段類型爲Long類型 BigDecimal bigDecimal = (BigDecimal) value; field.set(object, bigDecimal.longValue()); } else if (fieldType.isAssignableFrom(Integer.class) || fieldType.getName().equals("int")) { BigDecimal bigDecimal = (BigDecimal) value; field.set(object, bigDecimal.intValue()); } else if (fieldType.isAssignableFrom(Double.class) || fieldType.getName().equals("double")) { BigDecimal bigDecimal = (BigDecimal) value; field.set(object, bigDecimal.doubleValue()); } else if (fieldType.isAssignableFrom(Double.class) || fieldType.getName().equals("boolean")) { if (value instanceof String) { String _value = (String) value; field.set(object, "Y".equals(_value) ? true : false); } } else if (fieldType.isAssignableFrom(Date.class)) { Date date = null; if (value.getClass().getName().equals("oracle.sql.TIMESTAMP")) { date = new Date(((oracle.sql.TIMESTAMP) value).timestampValue().getTime()); } else if (value.getClass().getName().equals("java.sql.Date")) { date = new Date(((java.sql.Date) value).getTime()); } else { date = (Date) value; } field.set(object, date); } else if (fieldType.isAssignableFrom(java.sql.Date.class)) { java.sql.Date _value = null; if (value.getClass().getName().equals("oracle.sql.TIMESTAMP")) { _value = new java.sql.Date(((oracle.sql.TIMESTAMP) value).timestampValue().getTime()); } else if (value.getClass().getName().equals("java.sql.Date")) { _value = (java.sql.Date) value; } else { _value = new java.sql.Date(((Date) value).getTime()); } field.set(object, _value); } } } }
/** * @description:將javaBean轉換成Jfinal的Model對象 * 主體思路:model.set(field.getAnnotation(JFinalTableColumnAnnotation.class).fieldName, field.get(bean)) */ public static void beanToModel(Object bean, Model<?> model, boolean isAdd){ if(null==bean){ return; } Class<?> clazz = bean.getClass(); try { do { Field[] declaredFields = clazz.getDeclaredFields(); for (Field field : declaredFields) { Class<?> type = field.getType(); field.setAccessible(true); JFinalTableColumnAnnotation annotation = field.getAnnotation(JFinalTableColumnAnnotation.class); if (null != annotation) { //若是爲主鍵而且序列名不爲空且爲新增數據 Object value = field.get(bean); if(annotation.isPrimaryKey() && annotation.sequenceName().length() > 0 && isAdd){ if (value != null) { model.set(annotation.fieldName(), value); } else { model.set(annotation.fieldName(), annotation.sequenceName() + ".nextval"); } }else { //不是主鍵並可是該字段能夠執行更新操做或是添加數據 if(annotation.canUpdate()||isAdd){ //判斷javaBean中的字段類型 if (type.isAssignableFrom(Boolean.class)|| type.getName().equals(boolean.class.getName())) {//若是爲boolean或是其包裝類 if (annotation.yesOrNo() != null && annotation.yesOrNo().length > 1) { if (null != value) { boolean _value = (boolean) value; model.set(annotation.fieldName(), _value ? annotation.yesOrNo()[0] : annotation.yesOrNo()[1]); } } }else if(java.sql.Date.class.isAssignableFrom(type)){//若是是java.sql.Date類型 if(null!=value){ model.set(annotation.fieldName(),new Timestamp(((java.sql.Date)value).getTime())); } }else if(java.util.Date.class.isAssignableFrom(type)){//若是是java.util.Date類型 if(null!=value){ model.set(annotation.fieldName(),new Timestamp(((java.util.Date)value).getTime())); } }else{ if(null!=value){ model.set(annotation.fieldName(),value); } } }else if (!isAdd&&annotation.isPrimaryKey()) {//不是添加,而且是主鍵--主要用戶根據主鍵刪除 model.set(annotation.fieldName(), field.get(bean)); } } } } clazz=clazz.getSuperclass(); } while (!Object.class.getName().equals(clazz.getName())); } catch (Exception e) { e.printStackTrace(); } }
最後的測試:
最後作測試結尾;
public static void main(String[] args) { SyncDataDaoImpl model=new SyncDataDaoImpl(); ResumeDeliveryInfo bean=new ResumeDeliveryInfo(); bean.setObjId(1L); bean.setDetele(true); bean.setStatus("0"); bean.setCreateDate(new java.sql.Date(new Date().getTime())); beanToModel(bean, model, true); System.out.println("STATUS"+model.getStr("STATUS")); System.out.println(model.getStr("IS_DELETE")); System.out.println("CREATE_DATE"+model.getDate("CREATE_DATE")); System.out.println("OBJ_ID"+model.getLong("OBJ_ID")); }
-----------------------------分割線-----------------------------------------
以上僅做爲學習筆記,若是不足之處還望指教.謝謝
over.