有下面的代码,我怎么知道execute()方法是否导致插入或更新?:
Connection c = DriverManager.getConnection(connectionString);

PreparedStatement st = c.prepareStatement("INSERT INTO `table`(`field1`) VALUES (?) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);");

st.setString(1,"some value");
st.execute();

提前致谢.

解决方法

考虑以下MysqL测试表:
CREATE TABLE `customers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(100) NOT NULL,`email` varchar(100) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

现有样本数据如下:

id  name            email
--  --------------  ----------------
 1  Loblaw,Bob     bob@example.com
 2  Thompson,Gord  gord@example.com

使用默认连接设置compensateOnDuplicateKeyUpdateCounts = false(描述为here)以下Java代码

PreparedStatement ps = dbConnection.prepareStatement(
        "INSERT INTO customers (name,email) " +
        "VALUES (?,?) " +
        "ON DUPLICATE KEY UPDATE " +
            "name = VALUES(name)," +
            "id = LAST_INSERT_ID(id)");
ps.setString(1,"McMack,Mike");
ps.setString(2,"mike@example.com");
int euReturnValue = ps.executeUpdate();
System.out.printf("executeUpdate returned %d%n",euReturnValue);
Statement s = dbConnection.createStatement();
ResultSet rs = s.executeQuery("SELECT LAST_INSERT_ID() AS n");
rs.next();
int affectedId = rs.getInt(1);
if (euReturnValue == 1) {
    System.out.printf("    => A new row was inserted: id=%d%n",affectedId);
}
else {
    System.out.printf("    => An existing row was updated: id=%d%n",affectedId);
}

生成以下控制台输出

executeUpdate returned 1
    => A new row was inserted: id=3

现在使用参数值再次运行相同的代码

ps.setString(1,"Loblaw,Robert");
ps.setString(2,"bob@example.com");

和控制台输出是

executeUpdate returned 2
    => An existing row was updated: id=1

这表明如果唯一索引导致更新现有行,.executeUpdate确实可以返回2.如果您需要有关实际测试代码的进一步帮助,那么您应该编辑您的问题以包含它.

编辑

进一步测试显示.executeUpdate将返回1 if

>尝试的INSERT被中止,因为它会导致重复的UNIQUE键值,和
>指定的ON DUPLICATE KEY UPDATE更改实际上不会修改现有行中的任何值.

这可以通过使用完全相同的参数值连续两次运行上述测试代码来确认.请注意,UPDATE … id = LAST_INSERT_ID(id)“trick”确保返回正确的id值.

如果插入的唯一值是UNIQUE键值,这可能解释了OP的测试结果.

Java PreparedStatement和ON DUPLICATE KEY UPDATE:如何知道是否插入或更新了行?的更多相关文章

  1. JSP/Servlet 中的汉字编码问题

    这篇文章主要介绍了JSP/Servlet 中的汉字编码问题

  2. PHPShop存在多个安全漏洞

    phpShop存在多个安全问题,远程攻击者可以利用这些漏洞攻击数据库,获得敏感信息,执行任意脚本代码。目前厂商还没有提供补丁或者升级程序。

  3. Eclipse中使用ANT

    另外,使用ant的过程实际上对构建进行了文档化,它是无关于IDE的,想象一下,你的同事中可能三分之一在用JbuilderX,三分之一用eclipse,还有一些是别的。本人使用eclipse3.0.1,以前的构建和发布工作都由myeclipse插件作了,趁周末实践了一下手动构建,记此备忘。dlist-输出的jar或war当然,我们要建一个build.xml,eclipse中会出现一个蚂蚁的小图标,一般这个文件建立后,下一个项目简单的copy过去,稍加改动就可以了。

  4. JSP/Servlet应用程序优化八法

    本文讲述了开发高性能、高弹性的JSP页面和Servlet的性能优化技术。技术1:在HttpServletinit()方法中缓存数据服务器会在创建servlet实例之后和servlet处理任何请求之前调用servlet的init()方法。该方法在servlet的生命周期中仅调用一次。因此,在运行环境中为了得到更好的性能,关闭servlet/JSP的自动装载功能。为了支持必须维护状态的应用,Javaservlet技术提供了管理session和允许多种机制实现session的API。无论何时HttpSessio

  5. Php+SqlServer实现分页显示

  6. JAVA/JSP学习系列之四(Orion App Server的安装)

    下载完,解压到一个目录,我这里用E:\Orion作为例子。到现在,其实已经成功了缺省的配置了,如果你的80端口没有被占用,而且你也想用80作为端口的话,你到这里已经完成了,否则,请继续下面的配置。配置端口在E:\orion\config目录下有个default-web-site.xml文件,找到文件中下面行:将这行改为:

  7. PHP SOCKET 技术研究

    今天试着写一个PHP与C语言通过socket通讯的程序,看过PHP手册,发现有好几种方式可以建立socket客户端.1、通过fsockopen()建立socket连接,然后用用fputs()发送消息,用fgets()接收消息。该模块的行为,包括其函数的名称以及其它任何关于此模块的文档可能会在没有通知的情况下随PHP以后的发布而改变。我们提醒您在使用本扩展模块的同时自担风险。"看来php4.0socket通讯还不是完全稳定。

  8. apache+mysql+php+ssl服务器之完全安装攻略

    为了这个任务所需的工具是:Apache-一个网站服务器Mod_SSL-一个安全套接字层的模块OpenSSL-开放源代码工具箱RSARef-仅对美国用户MySQL-一个数据库服务器PHP-一种脚本语言。为了彼此方便地与Apache集成,我选择了PHP和MySQL。Apache得到对test.php的请求,它知道.php文件应由PHP预处理器处理,因此它通知PHP处理它。它知道这些,是因为我们在Apache的配置中指定它。Apache回送该结果到JohnDoe的浏览器,作为对他请求的应答。

  9. JSP由浅入深(9)—— JSP Sessions

    为了这个目的,我们可以使用JSP中的"sessions"。Session为不同的用户保存了不同了数据。以下的网页将用户的名字放置于session中,并可以在其它地方来显示它。这个表单的目标是“SaveName.jsp”,它在session保存了用户的名字。

  10. Eclipse开发Hibernate应用程序

    我现在把用Hibernate写的例子翻译成JDBC,大家就一目了然了:Connectionconn=...;

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部