JAVA反射机制自定义框架测试代码,留着以后复习用!

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值