[SQL] MyBatis로 일괄 삽입 / 업데이트 오라클
SQLMyBatis로 일괄 삽입 / 업데이트 오라클
최근,이 목록은 내가 통해 오라클 DB 테이블에 각 개체를 삽입 / 업데이트해야, 내가 지속적으로 WebService를 통해 객체의 새 목록을 가져 오기 위해 필요 myBatis.I 이제 이러한 시나리오에 직면하고 사용하는 학습을 시작했습니다 MyBatis로.
까다로운 부분은 일부 개체가 이미이 기록을 위해, 나는 그들의 필드 대신 새로운 삽입을 업데이트해야, DB에있을 수 있기 때문에 단순히마다 삽입 배치를 할 수 없다.
나의 현재 솔루션은 널 (이미 DB에 존재), 다음 MyBatis로 업데이트를 할 수없는 경우 MyBatis로는, 선택합니까, 그들 각각을 통해 웹 서비스에서 개체 루프의 목록을 작성, 자바를 사용하여, 매우 어리석은 수 있습니다; 그렇지 않으면,이 새로운 객체에 대한 MyBatis로 삽입을한다.
이 기능이 달성된다. 하지만 내 기술 리더는 시스템 자원을 많이 소모합니다 하나 Java 및 삽입 / 업데이트 하나를 사용하여 루프를하고 있기 때문에, 매우 낮은 효율 말합니다. 그는 개체의 목록을 전달하여 MyBatis로를 사용하여 삽입 배치를 할 저를 조언했다.
나는 순전히, 나는 배치 삽입 여기에 적절한 생각하지 않는다 (기존 기록을 위해 내가 업데이 트를 할 필요) 삽입하고 있지 않다 이후의 MyBatis에서 일괄 삽입은, 그러나, 간단합니다. 나는 이것에 대한 동안 인터넷 검색, 어쩌면 내가 대신 (Oracle 용) "삽입"의 "병합"을 사용해야합니다 깨달았다.
내가 MyBatis로의 병합에 알아 봤 예는 없습니다 배치에, 단 하나의 목적을위한 것입니다. 따라서 나는 전문가가 나에게 MyBatis로의 (a 매퍼를 작성하는 올바른 방법을) 일괄 병합 작업을 수행하는 방법에 대한 몇 가지 예를 제공 할 수 있는지 여부를 찾으려면?
해결법
-
==============================
1.내 경우도 동일한 시나리오가있다. 나는이 기록은 내가 삽입 또는 업데이트에 대한 두 가지의 ArrayList에이 객체를 추가했는지에 따라, 데이타베이스에 존재 여부를하고 있는지 여부를 확인하기 위해 루프에 사용됩니다. 그리고 목록에 그것을위한 루프 후 삽입 및 업데이트에 대한 일괄 처리를 사용했다.
내 경우도 동일한 시나리오가있다. 나는이 기록은 내가 삽입 또는 업데이트에 대한 두 가지의 ArrayList에이 객체를 추가했는지에 따라, 데이타베이스에 존재 여부를하고 있는지 여부를 확인하기 위해 루프에 사용됩니다. 그리고 목록에 그것을위한 루프 후 삽입 및 업데이트에 대한 일괄 처리를 사용했다.
여기 예입니다. 여기서, 다른 조건에 따라 업데이트
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();
사실 난 이미이 질문에 여기 전체 예제를 제공
-
==============================
2.허용 대답은 일괄 작업을 처리 권장되는 방법이 아닙니다. 이 세션을 열 때 일괄 실행 프로그램 모드를 사용한다 (때문에), true가 배치 문을 표시하지 않습니다. 코드 기여 일괄 업데이트 (또는 삽입)에 대해 적절한 방법은 배치 모드에서 세션을 열고 반복적으로 단일 레코드에 대한 업데이트 (또는 삽입)를 호출하는 것을 권장하는이 게시물을 참조하십시오.
허용 대답은 일괄 작업을 처리 권장되는 방법이 아닙니다. 이 세션을 열 때 일괄 실행 프로그램 모드를 사용한다 (때문에), true가 배치 문을 표시하지 않습니다. 코드 기여 일괄 업데이트 (또는 삽입)에 대해 적절한 방법은 배치 모드에서 세션을 열고 반복적으로 단일 레코드에 대한 업데이트 (또는 삽입)를 호출하는 것을 권장하는이 게시물을 참조하십시오.
여기에 나를 위해 작동 내용은 다음과 같습니다
public void updateRecords(final List<GisObject> objectsToUpdate) { final SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(ExecutorType.BATCH); try { final GisObjectMapper mapper = sqlSession.getMapper(GisObjectMapper.class); for (final GisObject gisObject : objectsToUpdate) { mapper.updateRecord(gisObject); } sqlSession.commit(); } finally { sqlSession.close(); } }
당신의 갱신 / 삽입에 foreach는 사용하고 그것은 단지 업데이트 / 삽입 한 기록을 확인하지 마십시오. 나는 (잘못된 문자가, 문 등을 종료하지 않음) 허용 대답에 따라 작업을 수행하여 해결할 수없는 Oracle 오류로 실행되었다. 링크 된 게시물에서 알 수 있듯이, 허용 대답에 표시된 업데이트 (또는 삽입) 실제로 단지 거대한 SQL 문입니다.
from https://stackoverflow.com/questions/23486547/mybatis-batch-insert-update-for-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MS-SQL 서버의 별칭 열에 의해 그룹을 수행합니까? (0) | 2020.04.30 |
---|---|
[SQL] SQL 서버 2008 - IF는 NOT INSERT ELSE UPDATE 존재 (0) | 2020.04.30 |
[SQL] MySQL의에서 다음 사용 가능한 ID를 찾기 (0) | 2020.04.30 |
[SQL] 어떻게 SQL Server의 시간을 비교할 수 있습니까? (0) | 2020.04.30 |
[SQL] 어떻게 그룹 CONCAT MySQL의와 JSON 형식을 만들? (0) | 2020.04.30 |