package cn.orm.util.builder.base;

import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
import cn.constant.CommonConst;
import cn.constant.RegExp;
import cn.constant.TimeFormat;
import cn.orm.util.metadata.DBMetaData;
import cn.orm.util.metadata.base.Field;
import cn.util.core.IsKit;
import cn.util.core.TypeKit;
import cn.util.string.StringKit;
import cn.util.time.TimeKit;

/**本类的方法是在系统已获取数据库表结构信息的前提下进行调用*/
public class SQLAssemblyUtil 
{
	
	/**JAva数据类型转换为MYSQL类型. 完成对SQL语句中的?进行赋值.  
	 * className为表中特定字段类型对应的Java类的名称
	 * V是用户从页面传给表中特定字段的值
	 * _c用户从页面传给表中特定字段值V的类类型
	 */
	public void setSQLParamValue(String tableName, Map<String, Object> mapRecord,
			Object[] fields,PreparedStatement pstmt,int bit) throws SQLException, ParseException, IOException
	{
		if( IsKit.isNullOrEmpty(tableName) || IsKit.isNullOrEmpty(mapRecord)
				|| IsKit.isNullOrEmpty(pstmt) || IsKit.isNullOrEmpty(fields))
		{
			return;
		}
		int size = fields.length;
		for (int i = 0; i < size; i++)//对对应的取值进行处理 
		{
			Field f = DBMetaData.getFields(tableName,fields[i].toString());//字段映射表
			int index = f.getJdbcType();
			/**库表字段定义时，如果某字段类型定义为：tinyint(1)，则字段类型对应的Java类java.lang.Boolean**/
			String className = f.getJavaTypeName();//字段类型对应的Java类的名称
			Object v = mapRecord.get(fields[i].toString());//获取给定字段的值（用户传入）

			//主要是确保_preparedStatementUpdateInsert正确。此方法每次调用需要对不同位置的？进行赋值
			if(bit >= 0) {
				i = bit;
			}
			if (IsKit.isNullOrEmpty(v))
			{
				if ("java.lang.Integer".equals(className)) {
					pstmt.setInt(i + 1, 0);
				}
				else if ("java.lang.Long".equals(className)) {
					pstmt.setLong(i + 1, 0L);
				}
				else if ("java.lang.Short".equals(className)) {
					pstmt.setShort(i + 1, (short) 0);
				}
				else if ("java.lang.Float".equals(className)) {
					pstmt.setFloat(i + 1, 0.0f);
				}
				else if ("java.lang.Double".equals(className)) {
					pstmt.setDouble(i + 1, 0.0);
				}
				else
					pstmt.setNull(i + 1, index);//设置字段值为NULl
			}
			//在页面表单中获取的数据均为String型,故应对其进行转换. 
			else
			{
				/**getClass()返回对象v真实的Class对象; getName()获取到带包名的全限定类名）*/
				String _c = ((Class<? extends Object>) v.getClass()).getName();
				if (("java.lang.String".equals(_c)) && 	("".equals((String.valueOf(v)).trim()))) {
					pstmt.setNull(i + 1, index);//continue;
				}
				//classname是数据库中字段类型
				else {
					//Java的String对应SQL的数据类型为:VARCHAR、CHAR、LONGVARCHAR、TEXT
					if ("java.lang.String".equals(className)) {
						//pstmt.setString(i + 1, CoreUtil.valueTypeConvert(v,String.class));
						pstmt.setString(i + 1, (String)valueTypeConvert(v,String.class));
						continue;
					}
					//对应SQL的数据类型为:TINYINT、SMALLINT、MEDIUMINT、BOOLEAN，TINYINT UNSIGNED
					if ("java.lang.Integer".equals(className)) {//tinyint
						pstmt.setInt(i + 1, (Integer)valueTypeConvert(v,Integer.class));
						continue;
					}
					//对应SQL的数据类型为:Bigint， INTEGER UNSIGNED.  
					if ("java.lang.Long".equals(className)) {
						pstmt.setLong(i + 1, (Long)valueTypeConvert(v,Long.class));
						continue;
					}
					//对应SQL的数据类型为:SMALLINT
					if ("java.lang.Short".equals(className)) {
						pstmt.setShort(i + 1, (Short)valueTypeConvert(v,Short.class));
						continue;
					}
					//对应SQL的数据类型为:REAL
					if ("java.lang.Float".equals(className)) {
						pstmt.setFloat(i + 1, (Float)valueTypeConvert(v,Float.class));
						continue;
					}
					//对应SQL的数据类型为:FLOAT、Double
					if ("java.lang.Double".equals(className)) {
						pstmt.setDouble(i + 1, (Double)valueTypeConvert(v,Double.class));
						continue;
					}
					//对应SQL的decimal、NUMERIC
					if ("java.math.BigDecimal".equals(className)) {
						pstmt.setBigDecimal(i + 1, (BigDecimal)valueTypeConvert(v,BigDecimal.class));
						continue;
					}

					//对应SQL的数据类型为:BIT
					if ("java.lang.Boolean".equals(className)) {
						pstmt.setBoolean(i + 1, (Boolean)valueTypeConvert(v,Boolean.class));
						continue;
					}
					//对应SQL的数据类型为：TINYINT   MySQL的tinyint是java.lang.Byte
					if ("java.lang.Byte".equals(className)) {
						pstmt.setByte(i + 1, (Byte)valueTypeConvert(v,Byte.class));
						continue;
					}

					/**数据库定义为year的类型（只有年），系统的java.sql.Date.valueOf函数无法正确工作。因为
			   		valueOf参数必须是一个有效日期的yyyy-mm-dd格式类型的日期*/
					//对应SQL的数据类型为：date
					if ("java.sql.Date".equals(className))
					{
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) 
						{
							/**判断yyyy-mm-dd格式类型的日期*/
							if (IsKit.isValidDate(String.valueOf(v))){
								pstmt.setDate(i + 1, java.sql.Date.valueOf(String.valueOf(v)));
							}
							/**判断是否为UTC格式类型的日期*/
							else if (IsKit.isValidUTC(String.valueOf(v))){
								java.util.Date utilDate = TimeKit.UTCToTimestamp(TypeKit.objToStr(v));
								pstmt.setDate(i + 1,new java.sql.Date(utilDate.getTime()));
							}
							else{//“规范化”的java.sql.Date只包含年月日信息，时分秒毫秒都会清零
								pstmt.setString(i + 1, String.valueOf(v));
							}
						} else if ("java.util.Date".equals(_c)) {
							java.util.Date _v = (java.util.Date) v;
							pstmt.setDate(i + 1, new java.sql.Date(_v.getTime()));
						} else {
							pstmt.setDate(i + 1, (java.sql.Date) v);
						}
						continue;
					}
					//对应SQL的数据类型为：YEAR、DATE
					if ("java.util.Date".equals(className)) 
					{
						if (("java.lang.String".equals(_c))	&& (!"".equals((String.valueOf(v)).trim()))) 
						{
							/**判断yyyy-mm-dd格式类型的日期*/
							if (IsKit.isValidDate(String.valueOf(v))){
								pstmt.setDate(i + 1, java.sql.Date.valueOf(String.valueOf(v)));								 
							}
							/**判断是否为UTC格式类型的日期*/
							else if (IsKit.isValidUTC(String.valueOf(v))){
								java.util.Date utilDate = TimeKit.UTCToTimestamp(TypeKit.objToStr(v));
								pstmt.setDate(i + 1,new java.sql.Date(utilDate.getTime()));
							}
							else{
								Date date = TimeKit.fomatDateTime(String.valueOf(v));
								pstmt.setTimestamp(i + 1,TimeKit.dateToTimestamp(date));
							}
						} 
						else if ("java.util.Date".equals(_c)) {
							java.util.Date _v = (java.util.Date) v;
							pstmt.setDate(i + 1, new java.sql.Date(_v.getTime()));
						} else {
							pstmt.setDate(i + 1, (java.sql.Date) v);
						}
						continue;
					}

					//对应SQL的数据类型为：BIGINT 2017.10.8
					if ("java.math.BigInteger".equals(className)) {
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setLong(i + 1, (BigInteger.ZERO).longValue());//2019
						} else {
							pstmt.setLong(i + 1, ((java.math.BigInteger) v).longValue());
						}
						continue;
					}
					if ("java.lang.Object".equals(className)) {
						//SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setBytes(i + 1, (String.valueOf(v)).getBytes());
						} else {
							pstmt.setObject(i + 1, v);
						}
						continue;
					}
					//对应SQL的数据类型为：TIME
					if ("java.sql.Time".equals(className)) {
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setTime(i + 1, java.sql.Time.valueOf(String.valueOf(v)));
						} else if ("java.util.Date".equals(_c)) {
							java.util.Date _v = (java.util.Date) v;
							DateFormat df = new SimpleDateFormat("HH:mm:ss");
							String _dt = df.format(_v);
							pstmt.setTime(i + 1, java.sql.Time.valueOf(_dt));
						} else {
							pstmt.setTime(i + 1, (java.sql.Time) v);
						}
						continue;
					}
					/**LocalDateTime类默认的格式是 yyyy-MM-ddTHH:mm:ss 而mysql中DateTime的格式是yyyy-MM-dd HH:mm:ss 所以在存入数据库时要进行格式转换
					 *Java8里面新出来了一些API，LocalDate、LocalTime、LocalDateTime 非常好用，默认的情况下，在mybatis里面不支持java8的时间、日期。直接使用，会报如下错误
					 *对应SQL的数据类型为：DATETIME、TIMESTAMP
					 * if ("java.sql.Timestamp".equals(className)) {
					 */
					if ( "java.sql.Timestamp".equals(className) ||  
							"java.time.LocalDateTime".equals(className)
							) {
						if ("java.lang.String".equals(_c))  {
							if(!"".equals((String.valueOf(v)).trim())) {
								String _s = (String.valueOf(v)).trim();
								if (StringKit.matches(RegExp.PATTERN_CHINADATE, _s)) {//如：2012-01-24
									Time t = new Time(0l);
									_s = _s + " " + t.toString();
									pstmt.setTimestamp(i + 1, java.sql.Timestamp.valueOf(_s));
								} else {
									pstmt.setTimestamp(i + 1, java.sql.Timestamp.valueOf(String.valueOf(v)));
								}
							}
							else {
								pstmt.setTimestamp(i + 1, java.sql.Timestamp.valueOf(TimeKit.getNow()));//默认为当前时间
							}
						} else if ("java.sql.Date".equals(_c)) {
							java.sql.Date _v = (java.sql.Date) v;
							pstmt.setTimestamp(i + 1, new Timestamp(_v.getTime()));
						} else if ("java.util.Date".equals(_c)) {
							java.util.Date _v = (java.util.Date) v;
							pstmt.setTimestamp(i + 1, new Timestamp(_v.getTime()));
						} else if ("java.sql.Time".equals(_c)) {
							java.sql.Time _v = (java.sql.Time) v;
							pstmt.setTimestamp(i + 1, new Timestamp(_v.getTime()));
						} else {
							pstmt.setTimestamp(i + 1, new Timestamp(((java.util.Date) v).getTime()));//能支持更多的应用
							//pstmt.setTimestamp(i + 1,  (java.sql.Timestamp) v);//使用jsf日期转换后获得的结果可能不完整，这时会出现转换异常
						}
						continue;
					}
					//对应SQL的数据类型为：BINARY VARBINARY LONGVARBINARY
					if ("[B".equals(className) || "byte[]".equals(className)) {
						//SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setBytes(i + 1, (String.valueOf(v)).getBytes());
						} else {
							pstmt.setBytes(i + 1, (byte[]) v);
						}
						continue;
					}
					//对应SQL的数据类型为：BLOB
					if ("java.sql.Blob".equals(className)) {
						//SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setBytes(i + 1, (String.valueOf(v)).getBytes());
						} else {
							pstmt.setBlob(i + 1, (java.sql.Blob) v);
						}
						continue;
					}
					//以下部分将根据具体的数据库需要而定,有待验证
					if ("java.sql.Clob".equals(className)) {
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setString(i + 1, String.valueOf(v));//给clob类型的字段赋予字符串型
						} else {
							pstmt.setClob(i + 1, (java.sql.Clob) v);
						}
						continue;
					}
					//以下部分将根据具体的数据库需要而定,有待验证
					if ("java.sql.Array".equals(className)) {
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							//
						} else {
							pstmt.setArray(i + 1, (java.sql.Array) v);
						}
						continue;
					}
					//特殊类型，非常用，置后
					if ("com.sybase.jdbc2.tds.SybTimestamp".equals(className) || className.indexOf("timestamp") > 0) {
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setTimestamp(i + 1, java.sql.Timestamp.valueOf(String.valueOf(v)));
						} else {
							pstmt.setTimestamp(i + 1, (java.sql.Timestamp) v);
						}
						continue;
					}

					//概略匹配
					if (className.indexOf("date") > 0) {
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setDate(i + 1, java.sql.Date.valueOf(String.valueOf(v)));
						} else {
							pstmt.setDate(i + 1, new java.sql.Date(((java.util.Date) v).getTime()));
						}
						continue;
					}

					if (className.indexOf("time") > 0) {
						if (("java.lang.String".equals(_c)) && (!"".equals((String.valueOf(v)).trim()))) {
							pstmt.setTime(i + 1, java.sql.Time.valueOf(String.valueOf(v)));
						} else {
							pstmt.setTime(i + 1, (java.sql.Time) v);
						}
						continue;
					}

					if ("java.io.FileInputStream".equals(_c)) {
						//调用如：FileInputStream in = new FileInputStream("D:\\test.jpg");的结果
						pstmt.setBinaryStream(i + 1, (FileInputStream) v, ((FileInputStream) v).available());
						continue;
					}//java.io.FileInputStream
					//其它特殊类型，非常用，置后
				}
			}
		}//对对应的取值进行处理 For
	}
	
	/**JAVA对象取值转换为SQL对应的值
	 * className为表中特定字段类型对应的Java类的名称
	 * V是用户从页面传给表中特定字段的值
	 * _c用户从页面传给表中特定字段值V的类类型
	 */
	public static Object objTypeMappingToSqlType(String className, Object v)	
	{
		Object result = null;
		if(IsKit.isNullOrEmpty(className)) {
			return result;
		}
		if(IsKit.isNullOrEmpty(v))	// (v == null) || "null".equals(v)
		{ 
			if ("java.sql.Date".equals(className) || "java.util.Date".equals(className)) {
				result = CommonConst.DATE_DEFAULT;
			}
			else if ("java.lang.Integer".equals(className) ) {
				result = "0";//无意义
			}
			//else if ("java.sql.Timestamp".equals(className)) {
			else if ( "java.sql.Timestamp".equals(className) ||  
					"java.time.LocalDateTime".equals(className)
					) {
				result = CommonConst.DATETIME_DEFAULT;
			}
			else if ("java.math.BigInteger".equals(className)) {
				result = new java.math.BigInteger("0");
			}
			else {
				result = "";
			}
			return result;
		}
		//对象的类型
		String _c = ((Class<? extends Object>) v.getClass()).getName();
		if ("java.lang.String".equals(className)) {
			return TypeKit.objToStr(v);
		}
		//2
		if ("java.lang.Integer".equals(className)) {
			return TypeKit.objToInt(v);
		}
		//5
		if ("java.lang.Long".equals(className)) {
			return TypeKit.objToLong(v);
		}
		//6
		if ("java.lang.Short".equals(className)) {
			return TypeKit.objToShort(v);
		}
		//7
		if ("java.lang.Float".equals(className)) {
			return TypeKit.objToFloat(v);
		}
		//8
		if ("java.lang.Double".equals(className)) {
			return TypeKit.objToDouble(v);
		}
		//9
		if ("java.lang.Boolean".equals(className)) {
			return TypeKit.objToBoolean(v);
		}
		//11 MySQL： Bigint
		if ("java.math.BigInteger".equals(className)) {
			return TypeKit.objToLong(v);
		}
		//10
		if ("java.math.BigDecimal".equals(className)) {
			return TypeKit.objToBigDecimal(v);
		}
		//3
		if ("java.sql.Date".equals(className) || "java.util.Date".equals(className)) {
			if ("java.lang.String".equals(_c)) 
			{
				if  (!("").equals((String.valueOf(v)).trim()))
				{
					/**判断yyyy-mm-dd格式类型的日期*/
					if (IsKit.isValidDate(String.valueOf(v))){
						result = java.sql.Date.valueOf(String.valueOf(v));								 
					}
					/**判断是否为UTC格式类型的日期*/
					else if (IsKit.isValidUTC(String.valueOf(v))){
						java.util.Date utilDate = TimeKit.UTCToTimestamp(TypeKit.objToStr(v));
						result = new java.sql.Date(utilDate.getTime());
					}
					else{
						result =  String.valueOf(v);
					}
				}
				else
					result = null;//"2000-01-01";
			} else if ("java.util.Date".equals(_c)) {
				java.util.Date _v = (java.util.Date) v;
				result =  new java.sql.Date(_v.getTime());
			} else {
				result =  (java.sql.Date) v;
			}
			return result;
		}

		//4 datetime 以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值  对应SQL的数据类型为：DATETIME、TIMESTAMP
		//if ("java.sql.Timestamp".equals(className)) {
		if ( "java.sql.Timestamp".equals(className) || "java.time.LocalDateTime".equals(className))
		{
			if ("java.lang.String".equals(_c))  {
				if(!("").equals((String.valueOf(v)).trim())) {
					String _s = (String.valueOf(v)).trim();
					result =  _s;
				}
				else {//result = java.sql.Timestamp.valueOf(CoreUtil.now());//默认为当前时间
					result = TimeKit.getNow();//默认为当前时间
				}
			} 
			else if ("java.sql.Date".equals(_c)) {
				java.sql.Date _v = (java.sql.Date) v;
				result = new Timestamp(_v.getTime());
			} 
			else if ("java.util.Date".equals(_c)) {
				java.util.Date _v = (java.util.Date) v;
				result =  new Timestamp(_v.getTime());
			}
			else if ("java.sql.Time".equals(_c)) {
				java.sql.Time _v = (java.sql.Time) v;
				result = new Timestamp(_v.getTime());
			} 
			else {
				result =  new Timestamp(((java.util.Date) v).getTime());//能支持更多的应用
				//result = (java.sql.Timestamp) v;//使用jsf日期转换后获得的结果可能不完整，这时会出现转换异常
			}
			return result;
		}	
		//12
		/**数据库定义为year的类型（只有年），系统的java.sql.Date.valueOf函数无法正确工作。因为 valueOf参数必须是一个有效日期的yyyy-mm-dd格式类型的日期*/
		if ("java.util.Date".equals(className)) 
		{
			if ( "java.lang.String".equals(_c) && !("").equals((String.valueOf(v)).trim())){
				//不存在 即非yyyy-mm-dd格式类型的日期
				if ( !IsKit.isValidDate(String.valueOf(v)))
				{
					result =  java.sql.Date.valueOf(String.valueOf(v));
				}
				else {
					result =  java.sql.Date.valueOf(String.valueOf(v));
				}
			} 
			else if ("java.util.Date".equals(_c)){
				java.util.Date _v = (java.util.Date) v;
				result =  new java.sql.Date(_v.getTime());
			} 
			else if ("java.time.LocalDateTime".equals(_c)) {
				result = v;
				if(IsKit.isNotNullOrEmpty(v) && TypeKit.objToStr(v).contains("T")) 
				{
					result = TimeKit.UTCToTimestampStr(TypeKit.objToStr(v));
				}
			} 
			else {
				result =  (java.sql.Date) v;
			}
			return result;
		}

		if ("java.sql.Time".equals(className)) {
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				result =  java.sql.Time.valueOf(String.valueOf(v));
			} 
			else if ("java.util.Date".equals(_c)) {
				java.util.Date _v = (java.util.Date) v;
				DateFormat df = new SimpleDateFormat("HH:mm:ss");
				String _dt = df.format(_v);
				result =  java.sql.Time.valueOf(_dt);
			} 
			else {
				result =  (java.sql.Time) v;
			}
			return result;
		}
		//对应SQL的数据类型为：BINARY VARBINARY LONGVARBINARY
		//14
		if ("[B".equals(className) || "byte[]".equals(className)) {
			//SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				result = (String.valueOf(v)).getBytes();
			} else {
				result =  (byte[]) v;
			}
			return result;
		}
		//对应SQL的数据类型为：BLOB
		//15
		if ("java.sql.Blob".equals(className)) 
		{
			//SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) 
			{
				result = (String.valueOf(v)).getBytes();
			} else {
				result =  (java.sql.Blob) v;
			}
			return result;
		}
		//16
		if ("java.lang.Object".equals(className)) 
		{
			//SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) 
			{
				result =  (String.valueOf(v)).getBytes();
			} else {
				result =  v;
			}
			return result;
		}
		//对应SQL的数据类型为：TINYINT
		//17
		if ("java.lang.Byte".equals(className)) 
		{
			//MySQL的tinyint是java.lang.Byte
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				result =  java.lang.Byte.parseByte(String.valueOf(v));
			} else {
				result = java.lang.Byte.parseByte(String.valueOf(v));
			}
			return result;
		}
		//18  以下部分将根据具体的数据库需要而定,有待验证
		if ("java.sql.Clob".equals(className)) {
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				result =  String.valueOf(v);//给clob类型的字段赋予字符串型
			} else {
				result =  (java.sql.Clob) v;
			}
			return result;
		}
		//19
		if ("java.sql.Array".equals(className)) {
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				//
			} else {
				result =  (java.sql.Array) v;
			}
			return result;
		}
		//20
		if ("com.sybase.jdbc2.tds.SybTimestamp".equals(className) || className.indexOf("timestamp") > 0) {
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				result =  java.sql.Timestamp.valueOf(String.valueOf(v));
			} else {
				result =  (java.sql.Timestamp) v;
			}
			return result;
		}
		//21
		if (className.indexOf("date") > 0) {
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				result =  java.sql.Date.valueOf(String.valueOf(v));
			} else {
				result = new java.sql.Date(((java.util.Date) v).getTime());
			}
			return result;
		}

		//22
		if (className.indexOf("time") > 0) {
			if (("java.lang.String".equals(_c)) && (!("").equals((String.valueOf(v)).trim()))) {
				result = java.sql.Time.valueOf(String.valueOf(v));
			} else {
				result =  (java.sql.Time) v;
			}
			return result;
		}
		result = v;

		return result;
	}


	/**将Object转成指定的类型*/
	private static Object valueTypeConvert(Object obj, Class<?> type) throws ParseException
	{
		if (IsKit.isNotNullOrEmpty(obj))
		{
			if (type.equals(Integer.class)||type.equals(int.class)) {
				if(IsKit.isInteger(TypeKit.objToStr(obj))) {
					return Integer.valueOf(TypeKit.objToStr(obj));//返回的是Integer对象
				}
				else {
					return 0;
				}
				//return new Integer(obj.toString());
			} 
			else if (type.equals(Long.class)||type.equals(long.class)) {
				/**Long.parseLong("String")返回long基本数据类型
				 * Long.valueOf("String")返回Long包装类型
				 */
				if(IsKit.isInteger(TypeKit.objToStr(obj))) {
					return Long.valueOf(TypeKit.objToStr(obj));
				}
				else {
					return 0;
				}
			}
			else if (type.equals(Boolean.class)||type.equals(boolean.class)) {
				return Boolean.valueOf(TypeKit.objToStr(obj));
			}
			else if (type.equals(Short.class)||type.equals(short.class)) {
				return Short.valueOf(TypeKit.objToStr(obj));
			}
			else if (type.equals(Float.class)||type.equals(float.class)) {
				if(IsKit.isDouble(TypeKit.objToStr(obj))) {
					return Float.valueOf(TypeKit.objToStr(obj));
				}
				else {
					return 0.0;
				}				
			}
			else if (type.equals(Double.class)||type.equals(double.class)) {
				if(IsKit.isDouble(TypeKit.objToStr(obj))) {
					return Double.valueOf(TypeKit.objToStr(obj));
				}
				else {
					return 0.0;
				}
			}
			else if (type.equals(Byte.class)||type.equals(byte.class)) {
				return Byte.valueOf(TypeKit.objToStr(obj));
			}
			else if (type.equals(Character.class)||type.equals(char.class)) {
				//return (T)new Character(obj.toString().charAt(0));
				return Character.toString((TypeKit.objToStr(obj)).charAt(0));
			}
			else if (type.equals(String.class)) {
				return TypeKit.objToStr(obj);
			}
			else if (type.equals(BigDecimal.class)){
				if(IsKit.isNumber(TypeKit.objToStr(obj))) {
					return new BigDecimal(TypeKit.objToStr(obj));
				}
				else {
					return new BigDecimal(0.0);
				}
			}
			else if (type.equals(LocalDateTime.class)) {
				//DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
				return LocalDateTime.parse(TypeKit.objToStr(obj));
			}
			else if (type.equals(java.util.Date.class)) {
				return (TimeFormat.SDF_YYYY_MM_DD).parse(TypeKit.objToStr(obj));
			}
			else{
				return null;
			}
		} 
		else{
			if (type.equals(Integer.class)||type.equals(int.class)) {
				return Integer.valueOf(0);
			} 
			else if (type.equals(Long.class)||type.equals(long.class)) {
				return Long.valueOf(0L);
			}
			else if (type.equals(Boolean.class)||type.equals(boolean.class)) {
				return Boolean.valueOf(false);
			}
			else if (type.equals(Short.class)||type.equals(short.class)) {
				return Short.valueOf("0");
			}
			else if (type.equals(Float.class)|| type.equals(float.class)) {
				return Float.valueOf(0.0F);
			}
			else if (type.equals(Double.class)||type.equals(double.class)) {
				return Double.valueOf(0.0);
			}
			else if (type.equals(Byte.class)||type.equals(byte.class)) {
				return Byte.valueOf("0");
			}
			else if (type.equals(Character.class)|| type.equals(char.class)) {
				return Character.toString('\u0000');
			}
			else if (type.equals(String.class)) {
				return new String("");
			}
			else if (type.equals(BigDecimal.class)) {
				return BigDecimal.valueOf(0.0);
			}
			else if (type.equals(java.util.Date.class)) {
				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
				return formatter.parse("2020-01-01");
			}
			else {
				return null;
			}
		}
	}
}
