通过反射将对象的属性拼接成为字符串

 /**
  * @return 返回指定类型sql 的局部;(update|insert)。
  * @param entity 实体对象
  *@param attrandfields 数组;三维数组。如:String[][] attrandfields={{attr1,attr2,attr3},{field1,field2,field3},{"","",""}}
  *@param  sqltype=1[insert]|2[update]
  * */
  public static String getSqlPart(Object entity,String[][] attrandfields,int sqltype ) throws Exception{
	  attrandfields=getProperty(entity,attrandfields);
	  if(sqltype==1){
    	String fields="",values="";
    	for(int i=0;i<attrandfields[0].length;i++){
    		if(attrandfields[2][i]==null)continue;
    		fields+=","+attrandfields[1][i];
    		values+=",'"+attrandfields[2][i]+"'";
    	}
    	if(fields.startsWith(",")){fields=fields.substring(1);values=values.substring(1);}
    	return "("+fields+") values("+values+")";
    }else  if(sqltype==2){
    	String fieldandvalue="";
    	for(int i=0;i<attrandfields[0].length;i++){
    		if(attrandfields[2][i]==null)continue;
    		fieldandvalue+=","+attrandfields[1][i]+"='"+attrandfields[2][i]+"'";
    	}
    	if(fieldandvalue.startsWith(",")){fieldandvalue=fieldandvalue.substring(1);}
    	return fieldandvalue+" ";
    }
	return null;
 }
  /**
   * 用排除字段法,这里假设实体属性=字段名。
   * 一般使用此方法,将不需要插入或更新的字段组成数组,传入此方法。
   * 1为插入,2为更新。
   * */
  public static String getSqlPart(Object entity,String[] noattr,int sqltype ) throws Exception{
	  String fields="";
	  Class clazz = entity.getClass();   
      Field field[] = clazz.getDeclaredFields();   
      for (Field f : field) {   
    	  int idx=isTableField(f,noattr);
    	  if(idx!=-1){continue;}
    	  fields+=","+f.getName();
      }
      if(fields.startsWith(","))fields=fields.substring(1);
      String[] attr=fields.split(",");
      String[][] attrandfields=new String[3][attr.length];//{{attr.split(",")},{attr.split(",")},{attr.split(",")};
      attrandfields[0]=attrandfields[1]=attr;
     return  getSqlPart( entity, attrandfields, sqltype );
  }
  /**
   * @return 返回指定实体,指定属性的值,如果不存在则为null。
   * */
  public static String[][] getProperty(Object entity,String[][] attrandfields) throws Exception {   
      Class clazz = entity.getClass();   
      Field field[] = clazz.getDeclaredFields();   
      for (Field f : field) {   
    	  int idx=isTableField(f,attrandfields[0]);
    	  if(idx==-1){continue;}
    	  boolean accessFlag = f.isAccessible();
			f.setAccessible(true);// 修改访问控制权限
           Object v =f.get(entity);// invokeMethod(entity, f.getName(), null);   
      	
			f.setAccessible(accessFlag);// 恢复访问控制权限
          //System.out.println(f.getName() + "\t" + v + "\t" + f.getType());   
          attrandfields[2][idx]=(v!=null)?v.toString():null;
         
      }   
      return attrandfields;
  }   
 /**
  * 此方法根据传入的属性,定位其在数组中的位置。并传回为value定位准备。
 * @param f
 * @param attrs
 * @return
 */
private static int  isTableField(Field f,String[]attrs){
	 for(int i=0;i<attrs.length;i++){
		 if(attrs[i].trim().equalsIgnoreCase(f.getName())){return i;}
	 }
	 return -1;
 }
  /**这是将传入的实体,以及要获取get方法的属性传入。通过转换首字母大小写,进行获取。
 * @param entity
 * @param fieldname
 * @param args
 * @return
 * @throws Exception
 */
private static Object invokeMethod(Object entity, String fieldname,  Object[] args) throws Exception {   
      Class clazz = entity.getClass();   
      fieldname = fieldname.substring(0, 1).toUpperCase()   + fieldname.substring(1);   
      Method method = null;   
      try {   
          method = clazz.getMethod("get" + fieldname);   
      } catch (SecurityException e) {   
      } catch (NoSuchMethodException e) {   
          return " can't find 'get" + fieldname + "' method";   
      }   
      return method.invoke(entity);   
  }   
     //

	public static void main(String[] args) {
		New  nue=new New();
		nue.setMake_man("zxy");
		nue.setNew_id("1111");
		nue.setMake_time("2011-12-12");
		nue.setMake_dpt_code("10506");
		  String[] attr=" New_id,new_no,new_org_code,new_date,new_man,description,asset_org_code, make_dpt_code ,Make_man,make_time,confirm_date,status".split(",");
		  //String field=" New_id,new_no,new_org_code,new_date,new_man,description,asset_org_code,make_dpt_code1,make_man,make_time,confirm_date,status";
		
		  String[][] attrandfield=new String[3][attr.length];//{{attr.split(",")},{attr.split(",")},{attr.split(",")};
		 attrandfield[0]=attrandfield[1]=attr;
		  try {
			String sqlpart=Util.getSqlPart(nue,attrandfield,1);
			System.out.println("insert into dtms_doc_new "+sqlpart);
			sqlpart=Util.getSqlPart(nue,new String[]{"serialVersionUID"},1);
			System.out.println("!--insert into dtms_doc_new "+sqlpart);
			 sqlpart=Util.getSqlPart(nue,attrandfield,2);
			System.out.println("update dtms_doc_new set "+sqlpart+" where New_id=1");
			sqlpart=Util.getSqlPart(nue,new String[]{"serialVersionUID"},2);
			System.out.println("!--update dtms_doc_new set "+sqlpart+" where New_id=1");
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值