Java >> Java tutorial >  >> Tag >> mybatis

MyBatis Batch Insert/Update for Oracle

Jeg er for nylig begyndt at lære at bruge myBatis. Jeg står nu over for et sådant scenarie, jeg er nødt til konstant at hente en ny liste over objekter gennem WebService, så for denne liste skal jeg indsætte/opdatere hvert objekt i oracle DB-tabellen gennem myBatis.

Den vanskelige del er, at jeg ikke bare kan lave en batch-indsættelse hver gang, fordi nogle af objekterne måske allerede eksisterer i DB, for disse poster skal jeg opdatere felterne i dem i stedet for en ny indsættelse.

Min nuværende løsning kan være meget dum, ved at bruge Java, opbyg listen over Objekt fra webservice, gå gennem hver af dem, lav en myBatis-selektion, hvis det ikke er en null (findes allerede i db), så lav en myBatis-opdatering; Ellers skal du lave en myBatis-indsættelse for dette nye objekt.

Funktionen er opnået. Men mit tekniske forspring siger, at det er meget laveffektivt, da det at lave en for-løkke ved hjælp af Java og indsætte/opdatere én efter én vil forbruge en masse systemressourcer. Han rådede mig til at lave batch-indsættelse ved hjælp af myBatis ved at sende en liste over objekter ind.

Batch-indsættelse i myBatis er ligetil, men da jeg ikke rent indsætter (for eksisterende poster skal jeg opdatere), tror jeg ikke, at batch-indsættelse er passende her. Jeg har googlet et stykke tid efter dette og indså, at jeg måske bliver nødt til at bruge "flet" i stedet for "indsæt" (til Oracle).

Eksemplerne, som jeg googlede ud efter fletning i myBatis, er kun til ét objekt, ikke i en batch. Derfor vil jeg finde ud af, om eksperter kunne give mig nogle eksempler på, hvordan man laver en batch-fletning i MyBatis (den korrekte måde at skrive en Mapper på)?

Svar

I mit tilfælde er der også samme scenarie. Jeg brugte for loop til at kontrollere, om denne post eksisterer i databse eller ej, og i henhold til det tilføjede jeg dette objekt til to arraylist for indsættelse eller opdatering. P>

her er ex. til opdatering i henhold til forskellige hvor-tilstand

1] dette er til opdatering

<foreach collection="attendingUsrList" item="model"  separator=";">
    UPDATE parties SET attending_user_count = #{model.attending_count}
    WHERE  fb_party_id = #{model.eid}  
</foreach>

2] dette er til indsættelse

<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>

In dao-metoden erklærer som

void insertAccountabilityUsers(@Param("usersList") List<AccountabilityUsersModel> usersList);

Opdater

Her er min batch-sessionskode

public static synchronized SqlSession getSqlBatchSession() {
    ConnectionBuilderAction connection = new ConnectionBuilderAction();
    sf = connection.getConnection();
    SqlSession session = sf.openSession(ExecutorType.BATCH);
    return session;
}

SqlSession session = ConnectionBuilderAction.getSqlSession(); 

Faktisk har jeg allerede givet et fuldstændigt eksempel her for dette spørgsmål


Java tag