package ff;
import java.lang.reflect.Field;
import java.sql.Date;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import java.sql.ResultSet;
/**
* BEAN 适用类 通过数据库结果集包装一个POJO,对它进行赋值
* 适用于非使用ORM框架的软件
*/
public class BeanWaper {
//传入的POJO对象参数
private Object obj;
//数据库结果集
ResultSet result;
//保存Field集合信息
private Map fields = new HashMap();
//预存储数据类型
private Map propertyType = new HashMap();
public BeanWaper(Object user,ResultSet result){
System.out.println("ABC");
this.obj = user;
this.result = result;
//基本常用数据类型 可能不完整
propertyType.put("int", Integer.valueOf(0));
propertyType.put("long", Integer.valueOf(1));
propertyType.put("String", Integer.valueOf(2));
propertyType.put("byte", Integer.valueOf(3));
propertyType.put("Date", Integer.valueOf(4));
propertyType.put("double", Integer.valueOf(5));
//补充 见 getDataBaseTypeValue(arg1,arg2,arg3)
//propertyType.put("**", Integer.valueOf(6));
//propertyType.put("**", Integer.valueOf(7));
}
/**
* @see 封装对象的字段名称和数据类型对象,供数据库取值时使用
* @return
*/
public Map getPropertyNamesAndType(){
Field[] classFields = getFields();
for(int flag = 0; flag < classFields.length; flag++ ){
fields.put(getPropertyName(classFields[flag]),getPropertyType(classFields[flag]));
}
System.out.println("1.Fields信息:"+"\n"+fields.toString());
return fields;
}
/**
* @see 获取所有字段的域
* @return
*/
public Field[] getFields(){
System.out.println("2.获取声明了的Fields信息"+"\n"+obj.getClass().getDeclaredFields().toString());
return obj.getClass().getDeclaredFields();
}
/**
* @see 获取指定字段域的数据类型
* @param field指定字段域
* @return
*/
public String getPropertyType(Field field){
StringSpilt spilt = new StringSpilt();
String[] values = spilt.split(field.getType().toString(), ".");
String propertyType = spilt.getLastString(values);
System.out.println("3.获取属性类型信息:"+"\n"+propertyType);
return propertyType;
}
/**
* @see 通过传入属性数据类型,名称,结果集,通过匹配从结果集中取出相应数据
* @param type
* @param name
* @param result
* @return
* @throws NumberFormatException
* @throws SQLException
*/
public Object getDataBaseTypeValue(String type,String name,ResultSet result) throws NumberFormatException, SQLException{
Object obj = null;
int flag = ((Integer)propertyType.get(type)).intValue();
switch(flag){
case 0 : obj = Integer.valueOf(result.getInt(name)); break;
case 1 : obj = Long.valueOf(result.getLong(name)); break;
case 2 : obj = String.valueOf(result.getString(name)); break;
case 3 : obj = Byte.valueOf(result.getByte(name)); break;
case 4 : obj = (Date)result.getDate(name); break;
case 5 : obj = Double.valueOf(result.getDouble(name)); break;
//补充
//case 6 : obj = String.valueOf(result.getString(name)); break;
}
System.out.println("4.打印获取的数据库值信息:"+"\n"+obj);
return obj;
}
/**
* @see 设置指定的BEAN类的值
* @param clazz
* @param value
* @param field
*/
public void setValue(Object clazz, Object value,Field field){
try {
field.set(clazz, value);
} catch (IllegalArgumentException e) {
e.printStackTrace();
System.out.println("5.打印异常信息如下:"+"\n"+e);
} catch (IllegalAccessException e) {
e.printStackTrace();
System.out.println("6.打印异常信息如下:"+"\n"+e);
}
}
/**
* @see 包装指定的BEAN类,结果为传入的BEAN将拥有设定的值
* @param result
* @throws NumberFormatException
* @throws SQLException
*/
public void waperBean(ResultSet result) throws NumberFormatException, SQLException{
Map names_types = getPropertyNamesAndType();
Set keys = names_types.keySet();
Iterator ite = keys.iterator();
while(ite.hasNext()){
String name = (String) ite.next();
String type = (String) names_types.get(name);
Field field = null;
try {
field = obj.getClass().getDeclaredField(name);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("7.打印异常信息如下:"+"\n"+e);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("8.打印异常信息如下:"+"\n"+e);
}
setValue(obj,getDataBaseTypeValue(type,name,result),field);
}
}
//获取属性名称
public String getPropertyName(Field field){
return field.getName();
}
/**
* 内部类 字符串分割类
*/
public class StringSpilt {
/**
*
* 分割字符串,原理:检测字符串中的分割字符串,然后取子串
*
* @param original 需要分割的字符串
*
* @paran regex 分割字符串
*
* @return 分割后生成的字符串数组
*
*/
public String[] split(String original,String regex)
{
// 取子串的起始位置
int startIndex = 0;
// 将结果数据先放入Vector中
Vector v = new Vector();
// 返回的结果字符串数组
String[] str = null;
// 存储取子串时起始位置
int index = 0;
// 获得匹配子串的位置
startIndex = original.indexOf(regex);
// System.out.println("0" + startIndex);
// 如果起始字符串的位置小于字符串的长度,则证明没有取到字符串末尾。
// -1代表取到了末尾
while(startIndex < original.length() && startIndex != -1)
{
String temp = original.substring(index,startIndex);
// System.out.println(" " + startIndex);
// 取子串
v.addElement(temp);
// 设置取子串的起始位置
index = startIndex + regex.length();
// 获得匹配子串的位置
startIndex = original.indexOf(regex,startIndex + regex.length());
}
// 取结束的子串
v.addElement(original.substring(index));
// 将Vector对象转换成数组
str = new String[v.size()];
for(int i=0;i<v.size();i++)
{
str[i] = (String)v.elementAt(i);
}
// 返回生成的数组
return str;
}
/**
* 功能描述:获取最后一个字符串
* @author ZhouMingXing
*/
public String getLastString(String[] values ){
int length = values.length;
if(length == 0){
return null;
}else{
return values[length-1];
}
}
}
//测试用途
public static void main(String[] args){
MyBean user = new MyBean();
try {
new BeanWaper(user,new java.sql.ResultSet()).waperBean(result);
System.out.println("最后结果信息如下:"+"\n"+user.getId()+" "+user.getName()+" "+user.getNumber()+" "+user.getMyBirthed()+" "+user.getMyImage()+" "+user.getPassword()+""+"");
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.println("9.打印异常信息如下:"+"\n"+e);
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("10.打印异常信息如下:"+"\n"+e);
}
}
}