恒表的对应类的属性的赋值问题研究

来源:互联网 发布:中国海关出口数据 编辑:程序博客网 时间:2024/05/16 08:05

   实际开发中,数据库往往会有冗余,因为数据量巨大,为了避免表间过多的关联,使查询效率降低!采用恒表是一个不错的选择

 而恒表就往往有很多字段,一般字段间还有规律可循,那么,我们从实际环境总采集到的数据,如何向恒表对应的类的属性进行赋

 值呢?巨量的属性 不可能挨个赋值,所以基于恒表对应类的属性赋值可行性需要研究

   我尝试很多方法,但是都失败了,后来采用的反射进行赋值,发现这个是一个不错想法,现在写下来给大家分享:

     假若有一个多的类:ExamResult  是对应试卷题目的信息的考试结果的一个实例类

     假设属性为:Class ExamResult{

                         private int question1Id;

                         private int question1Score;

                         ... ...                      //中间ID198个属性

                         ... ...                     //中间Score198个属性

                         private int question200Id;

                         private int question200Score;

 

                         }

  

    那个我们将学生的考试结果数据采集到了,如何给这个类的400个属性赋值呢?很显然挨个赋值是非常不现实和笨拙的方法

    下面采用反射方法赋值:

        主要思路是:遍历问题,依据问题的ID来拼成字符串:setQuestion+i+Id,setQuestion+i+Score

                          然后对ExamResult进行反射 Method[] methods = examResult.getClass().getMethods();

                          循环比较setQuestion+i+Id,setQuestion+i+Score methods[j].getName();

                          相同进行赋值 

   下面是实现简要代码:

  for (int i = 0; i < questions.size(); i++) {
   for(int j=0;j<methods.length;j++){
    String str = "setQuestion"+(i+1)+"Id"; //第i+1个属性的set方法
    String str_1 = "setQuestion"+(i+1)+"Score";
   if(str.equals(methods[j].getName())){
    System.out.println(str);
    System.out.println(methods[j].getName());
    //对examResult的属性进行赋值    将序列号为i的questions的ID赋给examResult
    try {
     methods[j].invoke(examResult, new Object[]{Long.parseLong(questions.get(i).getId())});
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
   if(str_1.equals(methods[j].getName())){
    if (!questions.get(i).getAnswer().equals(answers.get(i))) {
     //当问题的答案不一致时
     total = total - score;
     try {
      methods[j].invoke(examResult, new Object[]{new Long(0)});
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     //要如何赋给 ExamResult的属性?
     //examResult.setQ+i+""+Id(questions.get(i).getId());
     //score 在此处存储学生的成绩信息
     //存入context
    }else{
     //当问题的答案和问题的答案一致时
     try {
      methods[j].invoke(examResult, new Object[]{new Long(score)});
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
        }
    }
  }     

相对比挨个赋值,这个代码量少了很多!不错的解决方法~~

原创粉丝点击