All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.j2mvc.framework.dao.callback.CallbackObject Maven / Gradle / Ivy

Go to download

强烈建议使用J2mvc 2.1以后的版本。 version 2.1.01 1.优化路径跳转,Servlet和Filter方式的路径设置 2.优化内存销毁 3.更换JSON依赖包 4.优化接收方法RequestMethod,封装不同ContentType格式提交 封装JSON,XML数据提交模块 JSON请求示例 { "id":"JSON134851", "title":"JSON提交的标题", "price":65.1, "stock":100 } XML请求示例 <!DOCTYPE root [ <!ELEMENT root ANY> <!ATTLIST Product SSN ID #REQUIRED>]> <root> <Product SSN='id'>XMLID12354</Product> <Product SSN='title'>XML提交的标题 </Product> <Product SSN='price'>55 </Product> <Product SSN='stock'>32 </Product> </root> version 2.1.02 1.解决URL无后缀情况无法加载静态资源,解决无法渲染CSS文件。 version 2.1.03 1.移除com.j2mvc.StringUtils.getUtf8()方法调用 更改为getCharset() version 2.1.04 1.去除Servlet和Filter的全局变量销毁,只交给Listener处理。 version 2.1.05,2.1.06,2.1.07 1.完善POST提交的JSON数据 支持接收基础数据类型、任意对象类型、任意数组类型。 不支持接收参数为集合类型或Map类型,但可以定义为接收对象类型的元素。 version 2.1.05,2.1.06,2.1.07 1.修改连接池变量 version 2.1.09 增加上传功能,修改RequestMethod,ContentType设置方式 version 2.1.10,2.1.11 更改上传文件名格式为UUID格式,移除JSON映射类,更改接收多文件上传。 version 2.1.12 删除文件列有的空对象 version 2.1.13 增加配置文件目录/conf,加载上传功能配置/conf/upload.properties version 2.1.18 拦截器也能获取ActionBean version 2.1.20 添加上传文件只读权限 version 2.1.21 支持同时接收文件和文本数据 version 2.1.22 增加文件接收类型media version 2.1.23 删除upload类printJson方法

The newest version!
package com.j2mvc.framework.dao.callback;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.apache.log4j.Logger;

import com.j2mvc.framework.mapping.PrimaryKey;
import com.j2mvc.framework.util.FieldUtil;

/**
 * 预编译语句返回对象
 * @author 杨朔
 * 2014年1月13日
 */
public class CallbackObject extends PreparedStatementCallBack  {
	static final Logger log = Logger.getLogger(CallbackObject.class);

	private int executeType;
	private Class clazz;
	private Object object;
	private String dataSourceName;
	
	public CallbackObject(int executeType, Class clazz,String dataSourceName) {
		super();
		this.executeType = executeType;
		this.clazz = clazz;
		this.dataSourceName = dataSourceName;
	}
	public CallbackObject(int executeType, Object object,String dataSourceName) {
		super();
		this.executeType = executeType;
		this.object = object;
		this.dataSourceName = dataSourceName;
		this.clazz = object!=null?object.getClass():null;
	}

	@Override
	public Object execute(PreparedStatement pstmt) throws SQLException{
		if(executeType == EXECUTE_UPDATE){
			if(clazz !=null && clazz.isAssignableFrom(Integer.class)){
				object = pstmt.executeUpdate();
			}else if(object!=null){
				int i = pstmt.executeUpdate();				
				object = getKey(object, pstmt,i);
			}
		}else if(executeType == EXECUTE_QUERY){
			object = setObject(pstmt);
		}
		pstmt.close();
		return object;
	}
	
	/**
	 * 获取刚插入的数据
	 * @param pstmt
	 * 
	 * @throws SQLException
	 */
	private Object getKey(Object obj,PreparedStatement pstmt,int i) throws SQLException{

		/** 如是自增主键,则获取刚插入主键*/
		PrimaryKey primaryKey = obj.getClass().getAnnotation(PrimaryKey.class);
		if(!primaryKey.autoIncrement()){
			if(i>0)
				return obj;
		}
		ResultSet rsKey = pstmt.getGeneratedKeys();
		rsKey.next();
		try{
			PropertyDescriptor pd = new PropertyDescriptor(primaryKey.name(), obj.getClass());
			Method method = pd.getWriteMethod();

			Field field = FieldUtil.getField(primaryKey.name(), clazz);
			if(field!=null){
				Class type = field.getType();
				/** 设置主键*/				
				if(Integer.class.isAssignableFrom(type) || Short.class.isAssignableFrom(type))
					method.invoke(obj, rsKey.getInt(1));
				else if(Long.class.isAssignableFrom(type) )
					method.invoke(obj, rsKey.getLong(1));
				else{
					method.invoke(obj, rsKey.getString(1));
				}
			}else{
				log.error("未在类属性里找到主键字段");
			}
		}catch (IntrospectionException e) {
			e.printStackTrace();
		}catch (IllegalArgumentException e) {
			e.printStackTrace();
		}catch (IllegalAccessException e) {
			e.printStackTrace();
		}catch (InvocationTargetException e) {
			e.printStackTrace();
		}catch (SQLException e) {
			e.printStackTrace();
		} 
		rsKey.last();
		rsKey.close();
		return obj;
	}

	/**
	 * 对象setter
	 * @param pstmt
	 * 
	 * @throws SQLException
	 */
	private Object setObject(PreparedStatement pstmt) throws SQLException{
		// 主键
		Object obj = null;
		ResultSet rs = pstmt.executeQuery();
		while (rs.next()) {
			try {
				obj = clazz.newInstance();
				List fields = FieldUtil.getFields(null, clazz);
				InvokeObject.invoke(fields, obj, rs,dataSourceName);

				/** 获取刚插入主键*/
				PrimaryKey primaryKey = clazz.getAnnotation(PrimaryKey.class);
				ResultSet rsKey = pstmt.getGeneratedKeys();
				if(rsKey.first())
				try{
					PropertyDescriptor pd = new PropertyDescriptor(primaryKey.name(), clazz);
					Method method = pd.getWriteMethod();

					Field field;
					try {
						field = clazz.getDeclaredField(primaryKey.name());
						Class type = field.getType();
						/** 设置主键*/				
						if(Integer.class.isAssignableFrom(type) || Short.class.isAssignableFrom(type))
							method.invoke(obj, rsKey.getInt(1));
						else if(Long.class.isAssignableFrom(type) )
							method.invoke(obj, rsKey.getLong(1));
						else{
							method.invoke(obj, rsKey.getString(1));
						}
					} catch (SecurityException e) {
						log.error(e.getMessage());
					} catch (NoSuchFieldException e) {
						log.error(e.getMessage());
					}
				}catch (IntrospectionException e) {
					e.printStackTrace();
				}catch (IllegalArgumentException e) {
					e.printStackTrace();
				}catch (IllegalAccessException e) {
					e.printStackTrace();
				}catch (InvocationTargetException e) {
					e.printStackTrace();
				}catch (SQLException e) {
					e.printStackTrace();
				} 
				rsKey.close();
			} catch (InstantiationException e) {
				log.error(e.getMessage());
			} catch (IllegalAccessException e) {
				log.error(e.getMessage());
			}catch (IllegalArgumentException e) {
				log.error(e.getMessage());
			} 
		}
		rs.close();
		return obj;
	}
	
}