BeanWaper
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);
}
}
}