jfinal使用筆記--Model類與javaBean的相互轉換

1.解決問題.

        jfinal的Model對象與javaBean相互轉換java

2.實現大體思路.

        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

3.coed實現

 3.1首先定義註解類,用於javaBean的字段與數據中字段對應關係

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 {};
    
}

3.2:使用@JFinalTableColumnAnnotation註解javaBean

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(...)

}

 3.3 model轉換成JavaBean的實現

/**
	 * 將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);
				}
			}
		}
	}

3.4 bean裝換成model的實現

/**
	 * @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.

相關文章
相關標籤/搜索