在做项目的时候发现SQLsever和mysql有很多不一样的地方。其中有一条是SQLsever不支持getInsertObjectIDs(sql)方法。这样如果插入一条数据并且返回标识列就是一个很大的问题。
//mysql插入一条数据返回标识列 public int insert(Studio stu) { try { String sql = "insert into studio(studio_name, studio_row_count, studio_col_count, studio_introduction )" + " values('" + stu.getName() + "', " + stu.getRowCount() + ", " + stu.getColCount() + ", '" + stu.getIntroduction() + "' )"; DBUtil db = new DBUtil(); ResultSet rst = db.getInsertObjectIDs(sql); if (rst!=null && rst.first()) { stu.setID(rst.getInt(1)); return 1; } } catch (SQLException e) { e.printStackTrace(); } return 0; }后来想到了一个曲线救国的办法 ,我们可以先插入进去,然后按照刚才插进去的信息查询一次,返回标识列。但是这个问题在于,在java高并发的情况下,数据有肯能是一致的,毕竟只有主键是唯一标识。 后来发现完全可以查表里面的最大标识列,这样不就是刚插进去的数据的标识列,因为标识列是递增的 如果添加成功 ,就可以返回标识列。
//SQLsever插入数据返回标识列 public int save(CarItem t) { String sql = "use JZ insert into car(bookId,price,num,bookName,bookAuthor) values(?,?,?,?,?) "; int count = update(sql, t.getBookid(),t.getPrice(),t.getNum(),t.getBookName(),t.getBookAuthor()); int id = 0; if(count>0){ rs= query(" select max(carItemid) from car "); try { if(rs.next()) { id =rs.getInt(1); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return id; }这样就解决了SQLsever插入数据返回标识列的问题。