mybatis에서 대량으로 삽입하는 두 가지 방식 (고효율 삽입)

3781 단어 mybatis대량삽입
MyBatis 소개
MyBatis는 일반 SQL 조회, 저장 프로세스, 고급 매핑을 지원하는 우수한 지구층 프레임워크입니다.MyBatis는 거의 모든 JDBC 코드와 파라미터의 수동 설정과 결과 집합에 대한 검색 봉인을 제거합니다.MyBatis는 간단한 XML 또는 메모를 사용하여 구성 및 원본 맵에 사용할 수 있으며, 인터페이스와 Java의 POJO(Plain Old Java Objects, 일반 Java 객체)를 데이터베이스의 레코드로 매핑합니다.
1. mybiats foreach 태그
foreach는 주로 구축 in 조건에 사용되며, SQL 문장에서 하나의 집합을 교체할 수 있다.foreach 요소의 속성은 주로 item, index,collection,open,separator,close가 있습니다.item은 집합 중의 모든 요소가 교체될 때의 별명을 나타낸다. index는 하나의 이름을 지정한다. 교체 과정에서 매번 교체되는 위치를 나타낸다. open은 이 문장이 무엇으로 시작되는지,separator는 매번 교체될 때 어떤 기호를 구분자로 하는지,close는 무엇으로 끝날지 나타낸다. foreach를 사용할 때 가장 관건적이고 오류가 발생하기 쉬운 것은collection 속성이다.이 속성은 반드시 지정해야 하지만, 서로 다른 상황에서 이 속성의 값은 다르다. 주로 다음과 같은 세 가지 상황이 있다.
단일 매개 변수와 매개 변수 형식이 목록일 때,collection 속성 값은list
만약 단일 매개 변수와 매개 변수 형식이array 그룹일 때,collection의 속성 값은array
만약 전송된 매개 변수가 여러 개일 때, 우리는 그것들을 하나의 맵으로 봉인해야 한다
구체적인 사용법은 다음과 같다.

<insert id="insertBatch" parameterType="List">
INSERT INTO TStudent(name,age)
<foreach collection="list" item="item" index="index" open="("close=")"separator="union all">
SELECT #{item.name} as a, #{item.age} as b FROM DUAL
</foreach>
</insert>
2. mybatis ExecutorType.BATCH
Mybatis에 내장된 Executor Type은 3가지가 있습니다. 기본적으로simple입니다. 이 모드에서는 모든 문장의 실행을 위해 새로운 예처리 문장을 만들고 sql를 단일 제출합니다.반면batch모드는 이미 처리된 문장을 반복적으로 사용하고 모든 업데이트 문장을 대량으로 실행하면batch성능이 더욱 우수할 것이다.그러나batch모드도 자신의 문제가 있습니다. 예를 들어 Insert 작업을 할 때 업무가 제출되지 않기 전에 자체적으로 증가하는 id를 얻을 수 없습니다. 이것은 어떤 상황에서 업무 요구에 부합되지 않습니다.
구체적인 사용법은 다음과 같다.
* 방식1 spring+mybatis의

// sqlsession
// spring sqlSessionTemplate
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
//  BATCH, false session
//  true, , , 
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
// session mapper
fooMapper = session.getMapper(FooMapper.class);
int size = 10000;
try{
for(int i = 0; i < size; i++) {
Foo foo = new Foo();
foo.setName(String.valueOf(System.currentTimeMillis()));
fooMapper.insert(foo);
if(i % 1000 == 0 || i == size - 1) {
// 1000 ,  
session.commit();
// , 
session.clearCache();
}
}
} catch (Exception e) {
// 
session.rollback();
} finally{
session.close();
}
spring+mybatis
방법 2:
유니버설 매퍼 sql 별명과 결합하면 패키지 이름이 가장 좋다

public void insertBatch(Map<String,Object> paramMap, List<User> list) throws Exception {
//  BATCH, false session
//  true, , , 
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
try {
if(null != list || list.size()>0){
int lsize=list.size();
for (int i = 0, n=list.size(); i < n; i++) {
User user= list.get(i);
user.setIndate((String)paramMap.get("indate"));
user.setDatadate((String)paramMap.get("dataDate"));// 
//session.insert("com.xx.mapper.UserMapper.insert",user);
//session.update("com.xx.mapper.UserMapper.updateByPrimaryKeySelective",_entity);
session.insert(“ + ", user);
if ((i>0 && i % 1000 == 0) || i == lsize - 1) {
//  1000 , 
session.commit();
//  , 
session.clearCache();
}
}
}
} catch (Exception e) {
//  
session.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
위에서 말한 것은 편집자가 여러분께 소개한 mybatis에 대량으로 삽입하는 두 가지 방식(고효율 삽입)으로 여러분에게 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기