sqlsever插入一条数据返回标识列

在做项目的时候发现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插入数据返回标识列的问题。

你可能感兴趣的:(学习总结)