JAVA反射機制自定義框架測試程式碼,留著以後複習用!

java的爪哇發表於2013-07-16

JAVA反射機制自定義框架測試程式碼,留著以後複習用!

所有測試程式碼下載:http://download.csdn.net/detail/liangrui1988/5766647


主要重點程式碼


package accp.DaoImple;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.SortedMap;

import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

import accp.ddlUtil.Constr;
import accp.ddlUtil.JDBCHeiper;
import accp.ddlUtil.OperaterType;
import accp.utli.IDMapping;
import accp.utli.MappingMapManager;
import accp.utli.PropertyMapping;
import accp.utli.UserMapManager;
import accp.vo.Users2;


public class BaseDao<T> implements IBaseDao<T> {
	
	public  Connection conn=null;
	public  ResultSet rs=null;
	public  CallableStatement cs=null;
	public  PreparedStatement ps=null;
	public  Statement st=null;
	
	private UserMapManager xmlMapObj;//得到對映類
	private IDMapping idMapping;//得到對映id
	
	private Class clas;
	
	/**
	 * 初始構造方法時得到使用類的型別
	 */
	public BaseDao(){
		//載入配製檔案mapping 靜態塊中的程式碼  得到Map集合
		try {
			Class.forName("accp.xml.LoadMappingXML");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		
		// 得到泛型的類 
		// 即  BaseDaoImpl<Users>  得到Users
		//類的超類>>>現在型別的 論據
		Type type=((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0];
		clas=(Class<T>)type;
		
		//得到對映類
		System.err.println("clas:   "+clas+"   得到對映類:   "+clas.getName());
		this.xmlMapObj=MappingMapManager.getMappingUserObject(clas.getName());
		this.idMapping=xmlMapObj.getIdMaping();//得到對映id
	}
	
	/**
	 * 儲存DAO
	 * 獲得物件類路徑   反射成物件
	 * 獲得物件所有欄位
	 * sql 語句的拼接
	 * sql 條件的賦值
	 * 
	 */
	public boolean save(T obj) throws Exception{
		boolean b=false;
		//Class clas=obj.getClass();//反射生成類物件
	    //String tableName=clas.getSimpleName(); //得對物件名=表名;
		String tableName=xmlMapObj.getTableMapping().getTabless();
		//獲取物件所有的欄位
		Field[] fields=clas.getDeclaredFields();
		//列名
		StringBuffer columnName=new StringBuffer();
		//值
		StringBuffer valuesColumnName= new StringBuffer();
		//? 的值
		//Object[] values= new Object[fields.length];
		List<Object> valueList=new ArrayList<Object>();
		//迴圈得值,給值
		//int j=0;
		for(int i=0;i<fields.length;i++){			
			Field f=fields[i];//欄位值
			//得到欄位名 附加SQL語名
			columnName.append(f.getName()+",");
			
			//如是當前欄位是主健
			//否則加?
		String idM=idMapping.getIdName();
			
		if(idM.equalsIgnoreCase(f.getName())&&
		null==f.getName()&&idMapping.getGenClass().equals("sequence"))
		{
		   valuesColumnName.append(Constr.PubSquence_id);
				
		}else{
				//加入?
				valuesColumnName.append("?,"); 				
				f.setAccessible(true);
				//得到欄位的值
				//values[j]=f.get(obj);
				valueList.add(f.get(obj));
				//j++;				
			}			
		}
		
		//拼接sql
		System.out.println("columnName:"+columnName);
		//去掉後面的,
		String newcolumnName=columnName.substring(0, columnName.lastIndexOf(","));
		StringBuffer sql=new StringBuffer();
		sql.append("insert into "+tableName+"(");
		sql.append(newcolumnName);
		sql.append(") values(");
		//要插入的值
		String newvalueSql=valuesColumnName.substring(0,valuesColumnName.length()-1);
		sql.append(newvalueSql+")");
		System.out.println("SQL:"+sql.toString());
		//執行sql
		
		//把集合轉為陣列
		Object[] objValue=new Object[valueList.size()];
		for(int i=0;i<valueList.size();i++){
			objValue[i]=valueList.get(i);
		}
		
		//System.out.println("objValue.length:)"+objValue.length);
		b=executeUpdate(OperaterType.PreparedStatement, sql.toString(), objValue);
		return b;
		
	}
	
	
	/**
	 * 跟據物件ID 刪除
	 * 得到物件 反射
	 * 得到表名
	 * sql拼接
	 */
	public boolean deleteID(T obj) throws Exception{
		//得到classMapping類的關聯對映
		//根據類路徑(Key) 得到類的集合相關所有屬性
		//UserMapManager userMap=MappingMapManager.getMappingUserObject(obj.getClass().toString());
		
		//String tableName=obj.getClass().getSimpleName();
		//boolean b=false;
		String tableName=xmlMapObj.getTableMapping().getTabless();//得到表名
		System.out.println("tableName:"+tableName);		
		
		StringBuffer sql=new StringBuffer();
		//條件
		String ColumnID=idMapping.getIdColumn();
		sql.append("delete "+tableName+" where "+ColumnID+" =?");
		//反射得到欄位的值
		//Class clas=obj.getClass();
		//得到id
		Field field=clas.getDeclaredField(idMapping.getIdName());
		field.setAccessible(true);
		//得到id
		Object Oid=field.get(obj);
		//執行sql
		
	boolean b=executeUpdate(OperaterType.PreparedStatement, sql.toString(), Oid);
	return b;
	}
	
	
	
	/**
	 * executeUpdate執行語句方法	
	 */
	public boolean executeUpdate(OperaterType oper,String sql,Object...objs) {
	//OperaterType判斷是何種SQL操作
	boolean b=false;
    try {
    	//獲得連線
    	conn=JDBCHeiper.getConnections();
		if(conn==null){
			System.out.println("conn is null....");
			return false;
		}
		
		//statemnt
		if(OperaterType.Statement.equals(oper)){
			st=conn.createStatement();
			int count=st.executeUpdate(sql);
			if(count>0)b=true;	
		  }
		
		//prepareStatement
		if(OperaterType.PreparedStatement.equals(oper)){
			
			ps=conn.prepareStatement(sql);
			//條件賦值
			if(null!=objs&&objs.length>0){
				for(int i=0;i<objs.length;i++){
					System.out.println("objs:"+i+":   "+objs[i]);
					ps.setObject(i+1, objs[i]);
				}
			
			}
		
			int count=ps.executeUpdate();
			if(count>0)b=true;
			
		}
		
		//callableSatement儲存過程
        if(OperaterType.CallAbleSatment.equals(oper)){
        	cs=conn.prepareCall(sql);
        	//處理儲存過程
			
		}
        
		} catch (Exception e) {
			System.err.println("SQL執行語句出錯!");
			e.printStackTrace();
			
		}finally{
			JDBCHeiper.getCloseConn(conn, rs, cs, ps, st);
	        }
        
        return b;
	}
	
	
	
	
	//查詢x
	public List getQuery(T obj) throws Exception{
	/**
	 * 得到表名
	 * 行
	 */
	List list=new ArrayList();
	
	//String tableName=obj.getClass().getSimpleName();
	String tableName=xmlMapObj.getTableMapping().getTabless();
	System.out.println("tableName: "+tableName);
	//Class clas=obj.getClass();
	Field[] fileds=clas.getDeclaredFields();//得到所有的欄位
	
	List<Object> valueList=new ArrayList<Object>(0);
	/**
	 * 如有子段不為空,就在Where 後面加上and 欄位名=?
	 * 用valueList來儲存
	 * 否則就一需要加
	 */
	
	StringBuffer columnName=new StringBuffer();
	
	for(int i=0;i<fileds.length;i++){
	Field field=fileds[i];
	field.setAccessible(true);
	
	Object obje=field.get(obj);
	
	if(obje==null){
		
		obje="";}
	
	/**
	 * 根據屬性名得到欄位名
	 */
	String colName=getColumnNameByFieldName(field,idMapping.getIdName());
	
	
	if(null!=obje&&!"".equals(obje)){
		System.out.println(obje);
		System.out.println("object物件不為空!!!!!!!!");
		columnName.append(" and "+colName+"=?");
		valueList.add(obje);//加入值
	}
	
	}
	
	//sqlexecte
	StringBuffer sql=new StringBuffer();
	sql.append("select * from "+tableName+" where 1=1 ");
	//and 條件
	sql.append(columnName);
	System.out.println(sql.toString());
	
	
	//賦值反回
	
	
	/*
	 * 離線式資料集 ,在我們的資料庫關閉之後,資料不會丟失
	 * 線上式資料集,在關閉後會丟失
	 */
	
	Object ojbS=clas.newInstance();//物件的實列
	
	Result rst=JDBCHeiper.executeQuery(sql.toString(),valueList);
	
	int count=rst.getRowCount(); //多少行
	System.out.println("行:"+count);
	SortedMap[] sMap=rst.getRows();// 獲得每一行的資料
	
	
	//讀取每一行的資料;
	for(int i=0;i<sMap.length;i++){
		//讀取資料
		Object resultObj=clas.newInstance();//得到的物件
		SortedMap sm=sMap[i]; 
		System.out.println("BaseDao.getQuery()"+sm);
		//得到物件所有的欄位=每列的欄位
		Field[] fs=clas.getDeclaredFields();
		for(int j=0;j<fs.length;j++){
		
			Field f=fs[j];
			f.setAccessible(true);
			//設定值
			//System.out.println("xxxxxxxxxxxxx");
			setValue(resultObj,f,sm.get(f.getName()));
			
		}
		
		list.add(resultObj);
		
	}
	
	
	return list;
	}
	
	
	
	//型別判斷換
	private  void setValue(Object o,Field field,Object value) throws Exception{
		if(value!=null){
			String type = field.getType().getSimpleName();
	        if(type.equals("Integer")){   
	            if(value instanceof BigDecimal) {   
	                BigDecimal bd = (BigDecimal)value;
	                field.set(o, new Integer(bd.intValue()));
	            }   
	            if(value instanceof Long){   
	                Long l = (Long)value;   
	                field.set(o, new Integer(l.intValue()));
	            }   
	            if(value instanceof Integer) {   
	                field.set(o,value);   
	            }  
	        }   
	        
	        if(type.equals("long")){   
	            if(value instanceof BigDecimal){   
	                BigDecimal bd = (BigDecimal)value;   
	                field.set(o, new Long(bd.longValue())); 
	            }   
	            if(value instanceof Integer){   
	                Integer intt = (Integer)value;   
	                field.set(o, new Long(intt.longValue())); 
	            }   
	            if(value instanceof Long){   
	                field.set(o, value); 
	            }   
	        }   
	        if(type.equals("Float")){   
	            //field.set(o, Float.parseFloat(value.toString()));
	          
	        	
	            /*if(value instanceof BigDecimal) {   
	                BigDecimal bd = (BigDecimal)value;
	                field.set(o, new Float(bd.intValue()));
	            }   
	            if(value instanceof Long){   
	                Long l = (Long)value;   
	                field.set(o, new Float(l.intValue()));
	            }   
	            if(value instanceof Integer) {   
	            	Integer intv = (Integer)value;
	            	field.set(o, new Float(intv.intValue()));   
	            }
	            
	            if(value instanceof Integer) {   
	            	Integer intv = (Integer)value;
	            	field.set(o, new Float(intv.intValue()));   
	            }*/
	        	//System.out.println("Float的型別");
	            field.set(o, Float.parseFloat(value.toString()));
	            
	        }   
	        if(type.endsWith("Timstamp")){  
	            //method.invoke(o,new Object[]{(Timestamp)value});   
	            field.set(o, new Date(((Timestamp)value).getTime()));
	        }             
	        if(type.endsWith("Date")){   
	        	if(value instanceof Timestamp){
	        		//method.invoke(o,new Object[]{new Date(((Timestamp)value).getTime())});   
	        		field.set(o, new Date(((Timestamp)value).getTime()));
	        	}else if(value instanceof Date){
	        		field.set(o, (Date)value);
	        	}
	        }   
	        if(type.equals("double")){   
	            //method.invoke(o,new Object[]{(Double)value});   
	            field.set(o, value);
	        }   
	        if(type.endsWith("String")){  
	            //method.invoke(o,new Object[]{(String)value}); 
	            field.set(o, value.toString());
	        }
		}
			
		}

	
	//修改
	@Override
	public boolean update(T obj) {
		// TODO Auto-generated method stub
		return false;
	}
		
	/**
	 * 根據屬性名得到欄位名
	 */
	public String getColumnNameByFieldName(Field field,String colN){
		String colName="";
		
		if(field.getName().equals(colN)){
			colName=colN;
		}else{
			// 得到所有的屬性對映
		PropertyMapping proM=xmlMapObj.getMap(field.getName());
		// 如該欄位在hbm.xml 中有配置則得到欄位名
		// 否則預設為屬性名
		if(proM!=null){
			colName=proM.getProColumn();
		}else{
			colName=field.getName();
		}
			
		}
		
		return colName;
	}
		
		
	}
	


相關文章