`

iBatis批处理问题——对Oracle的insert into ...select...的错误使用

    博客分类:
  • ORM
阅读更多

最早发表时间:2009-02-17

 

    在开发一个需要用到iBatis批处理大量数据的功能时,遇到了一个无法优化的问题,苦苦思考了很久,查了很多资料,最终发现是语句没有预编译,导致批处理过程失效。
    在网上看到一些老文章说iBatis早先的版本不适用于批处理于多表的增删改操作,是因为老的iBatis底层对预编译的支持有些问题(这里不赘述,网文丰富得很)。
    该功能描述如下:
    我们需要将一个字段颇多的表(假定名为test_src)中的大量数据转移到另一个结构一样但名称不同的目标表(假定名为test_dest)中,使用insert ... select ...时,语句是这样写:

    insert into test_dest (id, col_B, col_C) 
    select '$newId$', col_B, col_C 
    from test_src s 
    where s.id = #id#

  

    其中参数newId是新纪录的新主键,为了防止与test_dest中已有的老数据重复,id是需要拷贝的旧数据的主键值,但是这里我犯了一个错误,由于对每条数据拷贝动作中'$newId$'都是一个新的值,也就导致了iBatis底层调用的PreparedStatment的预编译特性失效了,因为每次执行的SQL都不一样,而非只是参数不一样。

    为了实现相同的目的,向同事求教,发现我们使用的数据库中Oracle已经包含了一个生成UUID的函数,sys_uuid(),语句最终改成:

    insert into test_dest (id, col_B, col_C) 
    select sys_uuid(), col_B, col_C 
    from test_src s 
    where s.id = #id#

  

    这样只有参数部分是变动的,语句部分没有变化,预编译特性可以用上了!

分享到:
评论

相关推荐

    iBATIS操作Oracle CLOB数据

    综上所述,通过iBATIS操作Oracle的CLOB数据,需要对iBATIS的映射文件、类型处理器以及Oracle的CLOB特性有深入理解。在实际开发中,合理配置和使用这些机制,能够有效地管理大量文本数据,同时保持代码的简洁性和可...

    ibatis 中sqlMap配置

    insert into .... .... </insert> ``` 对于MySQL等支持自增主键的数据库,`<selectKey>`通常配置在插入语句之后,用于获取新插入记录的自增主键。 5. **SQL输入参数(ParameterClass)**: 在SQL语句中,通过`...

    ibatis_sqlMap的配置总结

    ### ibatis_sqlMap的配置总结 #### 一、ibatis_sqlMap配置的重要性 在iBatis框架中,SqlMap的配置扮演着极其重要的角色。它不仅关乎到应用程序能否正确地与数据库进行交互,而且在很大程度上决定了开发效率及项目...

    ibatis访问ORACLE

    通过上述步骤,我们展示了如何使用Ibatis访问Oracle数据库的简单实例。从配置环境、创建数据表到编写Java代码,再到实现数据库操作,Ibatis提供了一种灵活的方式,使得开发者能够更加专注于业务逻辑,而不是繁琐的...

    ibatis入门小例子

    在"ibatis-2.3.0.677.zip"文件中,包含了Ibatis的库文件,这个版本为2.3.0.677,提供了对SQL查询和更新的支持,以及与Java对象的交互机制。 首先,我们需要在Java项目中引入Ibatis的jar包。"ojdbc5.zip"文件包含...

    ibatis学习笔记

    ### Ibatis学习笔记 #### 一、Ibatis优点 **A.... 1. **SQL语句独立性**:Ibatis将SQL语句从Java源...以上内容涵盖了Ibatis的基本使用方法,从环境搭建到具体业务逻辑的实现,希望能帮助您更好地理解和使用Ibatis框架。

    ibatis常见案例

    Ibatis提供了两种主要的分页方式:一是使用`limit`和`offset`(MySQL),二是使用`rownum`(Oracle)。在映射文件中,可以通过动态SQL来实现分页功能。 ```xml <select id="selectUsersByPage" parameterType="map...

    ibatis常用的sql

    根据提供的文件信息,本文将对ibatis常用的SQL语句进行详细的解析与说明。这些SQL语句主要用于Oracle数据库中,涉及到了删除、插入以及查询等基本操作,并且在ibatis框架中实现了参数化处理。 ### 一、删除操作 ...

    ibatis结合oracle批量插入三种方法的测评

    iBatis结合Oracle批量插入三种方法的测评 iBatis是一种流行的持久层框架,提供了对数据库的访问和操作功能。Oracle是目前最流行的关系数据库管理系统之一。今天,我们将讨论iBatis结合Oracle批量插入三种方法的测评...

    Ibatis增删改简单应用配置示例说明实例

    首先,我们需要在项目中引入Ibatis2的jar包,包括核心库和对Oracle的驱动支持。确保pom.xml或build.gradle文件中包含相应的依赖。 ```xml <groupId>org.apache.ibatis <artifactId>ibatis-sqlmap <version>2.3....

    ibatis框架实现的增删改查

    本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...

    iBATIS有关资料

    iBATIS是一个在Java开发中广泛使用的持久层框架,它起源于2001年由Clinton Begin发起的开源项目,起初关注于密码软件的开发,但随着时间的发展,它逐渐演化为一个专注于数据库操作的轻量级框架。iBATIS的主要特点是...

    iBatis学习笔记

    iBatis的主要功能是实现对象关系映射(Object/Relational Mapping,简称O/R Mapping),这是一种将程序中的对象与数据库中的记录进行匹配的技术,使得开发人员可以更方便地操作数据库,减少对SQL语句的手动编写。...

    08_传智播客ibatis教程_sql主键生成方式

    在Ibatis的映射文件中,`<insert>`标签内使用`<selectKey>`子标签可以定义主键生成逻辑。例如: ```xml <insert id="insertUser" parameterType="com.example.User"> INSERT INTO users(name, email) VALUES (#{...

    ibatis 批量 增删改查

    3. 考虑数据库的特性,如MySQL的`ON DUPLICATE KEY UPDATE`或Oracle的`BULK COLLECT INTO`。 在Ibatis中,批量操作提供了更高效、更灵活的方式处理大量数据。理解并熟练应用这些技巧,能显著提升应用程序的性能和可...

    mybatis insert返回主键代码实例

    对于 Oracle 数据库,使用 `selectKey` 元素可以获取 sequence 的值,示例代码如下: ```xml <insert id="insertUser" parameterClass="ibatis.User"> <selectKey resultClass="long" keyProperty="id"> select ...

    springmybatis

    Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'); 到此为止,前期准备工作就完成了。下面开始真正配置mybatis项目了。 1. 在MyBatis 里面创建两个源码目录,分别为 src_user,test_src, 用...

    mysql中实现sequence.pdf

    在iBatis(现更名为MyBatis)框架中,可以使用`<selectKey>`标签来直接获取新插入记录的`AUTO_INCREMENT`ID,这样就无需额外编写代码来获取这个ID。例如,以下是一个iBatis的SQL映射配置: ```xml <insert id=...

    mybais框架学习总结

    INSERT INTO T_USER (T_ID, T_NAME, T_PASSWORD) VALUES (#{t_id}, #{t_name}, #{t_password}) </insert> ``` #### 五、总结 通过以上步骤,我们已经完成了使用 MyBatis 进行用户增删查改的基本操作。需要...

Global site tag (gtag.js) - Google Analytics