今天小编给大家展示的是sql server jdbc解决自动增长列统一处理问题纪实,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!
背景:系统要支持多种数据库,统一insert的时候获取自动增长列的处理方式
问题1:insert+select方案
sqlserver2000可以使用insertSql+ SELECT @@IDENTITY AS 'Identity'的方式来获得,但是mysql则只能使用executeUpdate(insertSql);
executeQuery('SELECTlast_insert_id() ')这样的方式,否则会抛出异常:: Can not issue data manipulation statements with executeQuery()
而两句话分开处理,总让人感觉不放心,如果并发操作比较多,存在潜在的危险。
问题2:getGeneratedKeys方案
mysql的驱动支持jdbc3.0,实现了getGeneratedKeys(),但sqlserver2000 jdbc驱动不支持getGeneratedKeys()
解决思路:
google了一下,据说是支持的,所以下下来看看
下载地址:url:
使用小结:
1.jdbc驱动是支持jdbc 3.0 的。也就是说,的确支持getGeneratedKeys()方法。
2.jdbc驱动url和包组织变动较大。
举例对比:
================
2000
================
url=""
driverClassName=""
================
================
url=""
driverClassName=""
如果没注意这点,必将出现异常:Cannot load JDBC driver class''
做好第二步,出现
3.包的位置:环境变量CLASSPATH不是必须的。但必须放置在中(如果是租用空间,可能得跟对方商量了,看是否支持的驱动)。
否则会发生异常:Cannot load JDBC driver class''
测试示例方法:
publicString executeUpdate(String sql) throwsSQLException ...{
Connection conn = getConnection();
PreparedStatement pstmt = null;
try ...{
/**//*注意:jdbc3.0提供了"用来指明需要从中获得自动增长列值,
如果不设置该参数,在执行getGeneratedKeys()时会抛出异常:"只有运行该语句,生成的键才会可用。"*/
pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
ResultSet rs =pstmt.getGeneratedKeys();//为了insert准备
if (rs.next())...{
return rs.getString(1);
}
return "-1";
} catch (SQLException ex) ...{
throw new SQLException(
"执行SQL语句失败。" +
ex.toString() +
"sql:"+sql);
} finally ...{
freeConnection(conn,pstmt);
}
}