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

我最近开始学习使用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适用于Oracle的批量插入/更新 的全部内容, 来源链接: utcz.com/qa/423081.html

回到顶部