当前位置: 首页 > 面试题库 >

MyBatis适用于Oracle的批量插入/更新

杜焕
2023-03-14
问题内容

我最近开始学习使用myBatis。现在面对这样的情况,我需要通过WebService不断获取新的对象列表,然后对于该列表,我需要通过以下方式将每个对象插入/更新到oracle
DB表中: myBatis。

棘手的部分是,我不能每次都简单地进行批量插入,因为某些对象可能已经存在于数据库中,对于这些记录,我需要更新它们的字段而不是新插入。

我当前的解决方案可能非常愚蠢,使用Java,从Web服务构建对象列表,遍历每个对象,进行myBatis选择,如果它不为null(数据库中已经存在),则进行myBatis更新;否则,请为此新对象进行myBatis插入。

功能已实现。但是我的技术主管说这效率很低,因为使用Java进行for循环并逐个插入/更新会消耗大量系统资源。他建议我通过传入对象列表来使用myBatis进行批量插入。

在myBatis中批量插入很简单,但是,由于我并不是纯粹地插入(对于现有记录,我需要进行更新),因此我认为批量插入在这里不合适。我为此搜索了一段时间,并意识到也许我将需要使用“合并”而不是“插入”(对于Oracle)。

我在myBatis中搜索要合并的示例仅适用于一个对象,而不适用于批处理。因此,我想了解专家是否可以为我提供一些示例,说明如何在MyBatis中进行批处理合并(编写Mapper的正确方法)?


问题答案:

就我而言,也有相同的情况。我使用了循环检查该记录是否存在于databse中,然后据此将该对象添加到两个arraylist中以进行插入或更新。然后使用批处理进行插入并在for循环后进行更新以列出该列表。

这是前 根据不同的条件进行更新

1]这是要更新

<foreach collection="attendingUsrList" item="model"  separator=";">
    UPDATE parties SET attending_user_count = #{model.attending_count}
    WHERE  fb_party_id = #{model.eid}  
</foreach>

2]这是用于插入

<insert id="insertAccountabilityUsers" parameterType="AccountabilityUsersModel" useGeneratedKeys="false">
    INSERT INTO accountability_users 
        (
            accountability_user_id, accountability_id, to_username,
            record_status, created_by, created_at, updated_by, updated_at
        ) 
    VALUES
    <foreach collection="usersList" item="model" separator=","> 
        (           
            #{model.accountabilityUserId}, #{model.accountabilityId}, #{model.toUsername}, 
            'A', #{model.createdBy}, #{model.createdAt}, #{model.updatedBy}, #{model.updatedAt}     
        )
    </foreach>
</insert>

在dao方法中声明为

void insertAccountabilityUsers(@Param("usersList") List<AccountabilityUsersModel> usersList);

更新资料

这是我的批处理会话代码

public static synchronized SqlSession getSqlBatchSession() {
    ConnectionBuilderAction connection = new ConnectionBuilderAction();
    sf = connection.getConnection();
    SqlSession session = sf.openSession(ExecutorType.BATCH);
    return session;
}

SqlSession session = ConnectionBuilderAction.getSqlSession();

其实我已经在这个问题上给出了完整的例子



 类似资料:
  • 我最近开始学习使用myBatis。我现在面临这样一个场景,我需要通过WebService不断获取一个新的对象列表,然后对于这个列表,我需要通过myBatis将每个对象插入/更新到oracle DB表中。 棘手的是,我不能每次都简单地进行批量插入,因为有些对象可能已经存在于数据库中,对于这些记录,我需要更新它们的字段,而不是新的插入。 我目前的解决方案可能非常愚蠢,使用Java,从webservic

  • 请让我知道,如何使用带注释的映射器在mybatis中执行批插入/更新。

  • 本文向大家介绍Oracle + Mybatis实现批量插入、更新和删除示例代码,包括了Oracle + Mybatis实现批量插入、更新和删除示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查。数据库连接进行事务提交的时候,需要耗费的资源比较多,如果需要插入更新的数据比较多,而且每次事务

  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • 问题内容: 有没有办法像在MySQL服务器上那样批量执行查询? 将无法使用,因为如果该字段已经存在,它将直接忽略该字段并且不插入任何内容。 将无法工作,因为如果该字段已经存在,它将首先对其进行处理,然后再次进行处理,而不是对其进行更新。 可以使用,但不能批量使用。 因此,我想知道是否可以批量发出这样的命令(一次不止一次发送)。 问题答案: 您 可以 使用INSERT … ON DUPLICATE

  • 问题内容: 我需要从每日CSV文件中消耗大量数据。CSV包含约12万条记录。使用hibernate模式时,这会减慢爬行速度。基本上,当使用saveOrUpdate()时,hibernate似乎在每个单独的INSERT(或UPDATE)之前执行SELECT。对于使用saveOrUpdate()持久存储的每个实例,在实际的INSERT或UPDATE之前发出SELECT。我能理解为什么要这样做,但是在进