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