日期:2014-05-20  浏览次数:20617 次

在用jdbc写dao时,插入数据库一条记录,然后返回这条记录的Java对象,怎么写最好?请各位高手指教,在线等。。。
本帖最后由 fengfenglucky 于 2012-11-14 10:27:32 编辑
我从其他类的对象得到的数据,在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;
    }

------解决方案--------------------
可以以在finally里面执行查询,你怎么插入的,你就怎么查询(voicebean .getAlarm_orgfp()和voicebean .getAlarm_sid()两个值就作为查询的条件),新建一个你要的对象,然后把根据查询结果把值一个个set进去,查询完了就关闭连接
------解决方案--------------------
引用:
这个方法我知道,但是需要两次操作数据库,并且还有序列的问题
请问有没有不用再次查询数据库就可以直接给对象赋值的方法呢? 有没有最合理的标准的方法吗?

你用JDBC没办法的,你必须先将数据持久化到数据库,然后才能查询出来的,如果用Hibernate框架可以直接使用。
多一次查询没关系的,框架也是要查询的,JDBC效率还是比较高的。你可以使用保存时相关字段的值去查询数据库获得这条新增记录在数据库的全部信息。
------解决方案--------------------
引用:
本身这个操作就是无意义的,哪来什么合理。
你的值从Java对象里来,直接塞到你要返回的对象里,如果插入不抛异常,直接把后面的对象返回去就完事了。

这个不好说,插入的数据是可以直接返回去使用,但是如果数据库的某个字段是有数据库维护的(如ID自增,触发器操作等等),这样的话,直接返回信息就不全了,就那ID自增来说,直接返回就无法获取到该记录的ID了,如果后面用户想通过ID删除或更新的话就麻烦了不是。
------解决方案--------------------
rs = stmt.getGeneratedKeys();
这个好像无法获取到Oracle的序列吧。
------解决方案--------------------
引用:
这个不好说,插入的数据是可以直接返回去使用,但是如果数据库的某个字段是有数据库维护的(如ID自增,触发器操作等等),这样的话,直接返回信息就不全了,就那ID自增来说,直接返回就无法获取到该记录的ID了,如果后面用户想通过ID删除或更新的话就麻烦了不是。 


那就封装一个存储过程去做这种事,类型可以变成in out既进又出

JDBC通用解决不可能,不过oracle有returning语法做这种事:
CallableStatement cst = con.prepareCall("begin insert into table(col1,col2) values(?,?) returning col1,col2 into ?,?; end;");