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

来源:互联网 发布:plc万能解密软件 编辑:程序博客网 时间:2024/05/21 06:11

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;//得到映射idprivate 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++;}}//拼接sqlSystem.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();//得到idField field=clas.getDeclaredField(idMapping.getIdName());field.setAccessible(true);//得到idObject Oid=field.get(obj);//执行sqlboolean 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;}//statemntif(OperaterType.Statement.equals(oper)){st=conn.createStatement();int count=st.executeUpdate(sql);if(count>0)b=true;  }//prepareStatementif(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;}//查询xpublic 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);//加入值}}//sqlexecteStringBuffer 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());        }}}//修改@Overridepublic boolean update(T obj) {// TODO Auto-generated method stubreturn 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;}}