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.