我从其他类的对象得到的数据,在dao中使用jdbc插入另外一张表,插入以后,需要返回这个刚插入的表所对应的对象,需要怎么写比较好呢?在线等,各位老师指点迷津。
 大概代码如下:
 private SmsRecordImpl __adSmsRecord(VoicebeanImpl  voicebean) {
         Connection conn = ConnectionDB.getInstance().getConn();
         String  sql = "insert into Iptfa_alarm_hnvoice_sms(Sms_id,Alarm_orgfp,Alarm_sid) values(seq_Iptfa_alarm_hnvoice_sms.nextval,?,?)";
         try {
             PreparedStatement ps = conn.prepareStatement(sql);
             ps.setString(1,voicebean .getAlarm_orgfp());
             ps.setString(2,voicebean .getAlarm_sid());          
             boolean b = ps.execute();
 //接下来不知道怎么写返回SmsRecordImpl的对象比较好了,请各位老师指点,谢谢了!!!
            // if(b==true ){
              //   ResultSet rs = ps.getResultSet();
                // SmsRecordImpl  sri = new SmsRecordImpl();
              //   sri.setSms_id(rs.getInt(1));
            // }
 
        } catch (SQLException e) {
             e.printStackTrace();        
     }
         return null;
     }

解决方案 »

  1.   

    插入完成后,再从数据里面查一下就可以了。//接下来不知道怎么写返回SmsRecordImpl的对象比较好了,请各位老师指点,谢谢了!!!
                 if(b==true ){
                     sql="select * from Iptfa_alarm_hnvoice_sms where Sms_id=
    (select seq_Iptfa_alarm_hnvoice_sms.currval from dual)";//利用主键查询,获取序列的当前值就是你刚插入的值
                     ps=conn.prepareStatement(sql);
                     ResultSet rs = ps.executeQuery();
                     SmsRecordImpl  sri = new SmsRecordImpl();
                     sri.setSms_id(rs.getInt(1));
                     ........
                 }
     
      

  2.   

    你需要一个查询语句把数据从另一个表中查出来放进结果集中进行遍历,将结果存入实体类中对应的的set方法中返回该实体对象就行了
      

  3.   

      if(b==true ){
                     ResultSet rs = ps.getResultSet();
                       if(rs.next){
                      SmsRecordImpl  sri = new SmsRecordImpl();
                      //用同样的方法设置sri对象中的属性
                          
                      sri.setSms_id(rs.getInt(1));
                     //比如: sri.setSms_id(rs.getString(2));
                    return sri ;
                  }
               }
             } catch (SQLException e) {
                  e.printStackTrace();        
          }
              return null;
          } 
      

  4.   

    多线程并发无需当心,因为oracle数据库对序列的返回是线程同步的
      

  5.   

    我用2楼的sql语句查询,没有查询出数据,我就直接用sql语句在ORACLE里面执行,结果发现错误如下:
    SQL> SELECT seq_Iptfa_alarm_hnvoice_sms.CURRVAL FROM SYS.dual;
    SELECT seq_Iptfa_alarm_hnvoice_sms.CURRVAL FROM SYS.dual
           *
    第 1 行出现错误:
    ORA-08002: 序列 SEQ_IPTFA_ALARM_HNVOICE_SMS.CURRVAL 尚未在此会话中定义序列的名字不错,请问各位这个SQL语句错在哪儿?该怎么写呢?
      

  6.   


    先单独执行(select seq_Iptfa_alarm_hnvoice_sms.nextval from dual) 返回一个主键
    在执行insert into
    在return seq
      

  7.   

    public class RowMapperImpl {
    //只要传入一个把查出来ResultSet对象,还有一个要用到的Bean的字节码就可以
    public static  Object mapRow(ResultSet rs,Class clazz) throws InstantiationException, IllegalAccessException{
    Object obj  = clazz.newInstance();
    try {
    for(int c=1;c<=rs.getMetaData().getColumnCount();c++)
    {
    String propertyName = rs.getMetaData().getColumnName(c);

    //同过PropertyDescritor类来获取对pt1对象的x字段的描述信息
    PropertyDescriptor pd = new PropertyDescriptor(propertyName,clazz);

    //通过描述信息就可以获取相应的set方法
    Method methodSetX = pd.getWriteMethod();

    //调用方法,传入要操作的对象,和要set进去的值。
    methodSetX.invoke(obj,rs.getObject(propertyName));
    }
    } catch (IllegalArgumentException e) {
    throw new ExceptionInInitializerError("找不到这个字段");
    } catch (SQLException e) {
    e.printStackTrace();
    } catch (IntrospectionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    // //获取当前结果集某中列的个数
    // rs.getMetaData().getColumnCount();
    // //获取当前结果集某一列的名称
    // rs.getMetaData().getColumnName(1);

    return  obj;

    }
    }