当前位置: 首页 > 图文教程 > 数据库 > MYSQL > sql server2005 jdbc解决自动增长列统一处理问题纪实

MYSQL
轻松解决Mysql“信息包过大”的处理方法
MySQL数据库实例管理器命令行选项详解
连接到MySQL实例管理器并创建用户账户
MySQL数据库中实例管理器识别的命令
教你快速了解应该如何升级MySQL系统表
轻轻松松正确掌握MySQL服务器关机进程
MySQL数据库搜索中大小写敏感性详细
如何正确认识Mysql通信错误与失效连接
MYSQL使用错误 MYSQL中ERROR 1005
MYSQL使用错误 MYSQL中ERROR 1006
MySQL手动安装方法与中文解决方案
MySQL事件调度器Event Scheduler详解
Mysql使用Describe命令判断字段是否存在
MySQL UPDATE时主键冲突引发的思考
怎样解决MySQL 5.0.16的乱码问题
详解如何用SQLyog来分析MySQL数据库
在MySQL数据库中如何为用户设置密码
MySQL多表操作和备份处理教程
在线设置MySql数据同步
tomcat+mysql数据库的连接池配置

MYSQL 中的 sql server2005 jdbc解决自动增长列统一处理问题纪实


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 70 ::
收藏到网摘: n/a

背景:系统要支持多种数据库,统一insert的时候获取自动增长列的处理方式

问题1:insert+select方案

sqlserver2000可以使用insertSql  + SELECT @@IDENTITY AS 'Identity'的方式来获得,但是mysql则只能使用executeUpdate(insertSql);

executeQuery('SELECT last_insert_id() ')这样的方式,否则会抛出异常:java.sql.SQLException: Can not issue data manipulation statements with executeQuery()

而两句话分开处理,总让人感觉不放心,如果并发操作比较多,存在潜在的危险。

问题2:getGeneratedKeys方案

mysql的驱动支持jdbc3.0,实现了getGeneratedKeys(),但sqlserver2000 jdbc驱动不支持getGeneratedKeys()

解决思路:

google了一下,据说2005是支持的,所以下下来看看

下载地址:url:http://download.microsoft.com/download/2/8/9/289dd6a3-eeeb-46dc-9045-d0c6b59bfbc1/sqljdbc_1.1.1501.101_chs.exe

使用小结:

1.2005jdbc驱动是支持jdbc 3.0 的。也就是说,的确支持getGeneratedKeys()方法。

2.2005jdbc驱动url和包组织变动较大。

举例对比:

================
2000
================
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb;SelectMethod=cursor"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
================
2005
================
url="jdbc:sqlserver://localhost:1433;DatabaseName=mydb;SelectMethod=cursor"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
如果没注意这点,必将出现异常:Cannot load JDBC driver class'com.microsoft.jdbc.sqlserver.SQLServerDriver'
做好第二步,出现

3.包的位置:环境变量CLASSPATH不是必须的。但sqljdbc.jar必须放置在tomcat/common/lib中(如果是租用空间,可能得跟对方商量了,看是否支持2005的驱动)。

否则会发生异常:Cannot load JDBC driver class'com.microsoft.sqlserver.jdbc.SQLServerDriver'

测试示例方法:

    public  String executeUpdate(String sql) throws    SQLException ...{
        Connection conn = getConnection();
        PreparedStatement pstmt = null;
        try ...{
            /**//*注意:jdbc3.0提供了Statement.RETURN_GENERATED_KEYS"用来指明需要从Statement中获得自动增长列值,
            如果不设置该参数,在执行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);
        }
    }