jfinal使用笔记--Model类与javaBean的相互转换

1.解决问题.

        jfinal的Model对象与javaBean相互转换

2.实现大致思路.

        javaBean==>Model

        1.首先定义注解类,类的变量定义fieldName表示对应于数据库的字段名称,在javaBean中成员变量定义是使用该注解字段

           2.利用反射机制获取到定义的数据库字段名(即上一步定义的fieldName)和字段的额value,将名称set到Model中

                model.set(fieldName,fieldValue);

           3.调用Model的成员方法 model.sava();

Model==>javaBean

            1.原理与 javaBean==>Model大致相同,同样先利用反射获取javaBean中定义的变量名称variable

            2.使用Model的方法model.get(variable)获取到数据库中对应列的值,当然这其中需要一些类型判断

            3.将值set到javaBean中()返回

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.

猜你喜欢

转载自my.oschina.net/u/3406827/blog/1793473