Heim >php教程 >PHP开发 >Zwei Möglichkeiten, Mybatis stapelweise einzufügen

Zwei Möglichkeiten, Mybatis stapelweise einzufügen

高洛峰
高洛峰Original
2016-11-22 15:26:421385Durchsuche

1. mybiats foreach-Tag

Foreach wird hauptsächlich zum Einbau von Bedingungen verwendet. Es kann einen Satz in einer SQL-Anweisung iterieren. Zu den Attributen des foreach-Elements gehören hauptsächlich Element, Index, Sammlung, Öffnen, Trennzeichen und Schließen. item stellt beim Iterieren den Alias ​​jedes Elements in der Sammlung dar, Index gibt einen Namen an, der verwendet wird, um die Position jeder Iteration während des Iterationsprozesses darzustellen, open stellt dar, womit die Anweisung beginnt, und Separator stellt die Zeit zwischen den einzelnen Iterationen dar. Welches Symbol als Trennzeichen verwendet wird und was „close“ bedeutet, dass es endet. Das kritischste und fehleranfälligste Element bei der Verwendung von „foreach“ ist die Angabe dieses Attributs. In verschiedenen Situationen ist der Wert dieses Attributs jedoch angegeben Anders. Es gibt hauptsächlich drei Situationen:

Wenn ein einzelner Parameter übergeben wird und der Parametertyp eine Liste ist, ist der Sammlungsattributwert Liste

Wenn ein einzelner Parameter übergeben wird und Wenn der Parametertyp ein Array-Array ist, ist der Attributwert der Sammlung ein Array

Wenn mehrere Parameter übergeben werden, müssen wir sie in eine Karte kapseln

Spezifische Verwendung Wie folgt:

<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 verfügt über drei integrierte ExecutorTypes. In diesem Modus wird für die Ausführung jeder Anweisung ein neuer erstellt. Bereiten Sie eine Anweisung vor und senden Sie eine einzelne SQL-Anweisung. Während der Batch-Modus die vorverarbeiteten Anweisungen wiederverwendet und alle Aktualisierungsanweisungen stapelweise ausführt, ist die Batch-Leistung natürlich besser, aber der Batch-Modus hat auch seine eigenen Probleme, beispielsweise während des Einfügevorgangs , wenn die Transaktion nicht erfolgt Vor der Übermittlung gibt es keine Möglichkeit, die automatisch inkrementierte ID zu erhalten, die in bestimmten Situationen nicht den Geschäftsanforderungen entspricht

Die spezifische Verwendung ist wie folgt:

* Methode 1 von Spring Mybatis

//获取sqlsession//从spring注入原有的sqlSessionTemplate@Autowiredprivate 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

Methode 2:

In Kombination mit dem allgemeinen Mapper-SQL-Alias ​​ist es am besten, den Paketnamen + den Klassennamen zu verwenden

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();
        }
    }


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Löschvorgang des VektorsNächster Artikel:Löschvorgang des Vektors