Quelles sont les méthodes d'insertion par lots de Mybatis

Il existe de nombreuses façons d'écrire l'insertion par lots MyBatis. Enfin, le blogueur résume certaines méthodes d'insertion par lots courantes pour votre référence.

liste de chemin

  1. <insert>Insertion groupée à l'aide du fichier de configuration XML : utilisez des balises dans le fichier de mappage XML et foreachparcourez les données par lots via les balises, puis utilisez des mots-clés dans l'instruction SQL VALUES.
  2. Insertion par lots à l'aide d'annotations Java : utilisez des annotations sur les classes d'entités @Insertet @Paramtransmettez les paramètres des données par lots via des annotations.
  3. List<Entity>Utilisez la liaison de données fournie par le langage de programmation Java pour l'insertion par lots : utilisez les paramètres du type dans le code Java et SqlSession.insert()effectuez l'insertion par lots via la méthode.
  4. Insertion par lots à l'aide de LambdaUpdate de MyBatis Plus : utilisez des annotations sur les classes d'entités @LambdaUpdateet définissez des instructions SQL pour l'insertion par lots via des expressions Lambda.
  5. Utilisez UpdateProvider de MyBatis Plus pour l'insertion par lots : utilisez des annotations sur les classes d'entités @UpdateProvideret spécifiez une UpdateProviderclasse personnalisée qui génère des instructions SQL pour l'insertion par lots par réflexion.
  6. Insertion par lots à l'aide du mécanisme de traitement par lots fourni par le langage de programmation Java : la méthode PreparedStatementutilisée dans le code Java , ajoutant plusieurs opérations d'insertion à la file d'attente de traitement par lots, puis exécutant toutes les opérations en même temps.addBatchexecuteBatch
  7. BatchExecutorInsertion par lots à l'aide de BatchExecutor de MyBatis Plus : utilisez des classes dans le code Java pour effectuer des opérations d'insertion par lots en spécifiant des instructions SQL et des listes de paramètres.
  8. @AutoBatchInsertUtilisez BatchInsertBuilder de MyBatis Plus pour l'insertion par lots : utilisez des annotations sur la classe d'entité et utilisez BatchInsertles méthodes statiques fournies par la classe pour effectuer des opérations d'insertion par lots.
  9. ExecutorType.BATCHUtilisez l'exécuteur par lots de MyBatis BatchExecutor pour l'insertion par lots : utilisez le type d'exécuteur dans le code Java , SqlSessionFactory.getSqlSession()obtenez l'exécution par lots SqlSession via la méthode, puis utilisez SqlSession.insert()la méthode pour effectuer l'insertion par lots.
  10. BaseMapperInsertion par lots à l'aide du Mapper de MyBatis Plus : utilisez la méthode d'interface en code Java insertList()pour opérer en transmettant la liste de données pour l'insertion par lots.

voie principale

Façon XML

<insert id="insertBatch" parameterType="java.util.List">  
    INSERT INTO table_name (column1, column2, ...)  
    VALUES  
    <foreach collection="list" item="item" separator=",">  
        (#{item.column1}, #{item.column2}, ...)  
    </foreach>  
</insert>

Méthode d'annotation

@LambdaUpdate({  
    @QuerySql("INSERT INTO table_name (column1, column2, ...) VALUES ",  
            "#{list,jdbcType=VARCHAR},#{list2,jdbcType=INTEGER}")  
})  
void insertBatch(List<Entity> list);

De manière plus

servicce.saveBatch(List<entity>,size)//size默认1000

Méthode du fournisseur

@UpdateProvider(sql = "INSERT INTO table_name (column1, column2, ...) VALUES ",provider = BatchEntityProvider.class)  
void insertBatch(List<Entity> list);
public class BatchEntityProvider extends AbstractEntityProvider<Entity> {  
    public BatchEntityProvider() {  
        super(Entity.class);  
    }  
    @Override  
    public String createSql(Entity model, String sql, LambdaSqlContext ctx) {  
        StringBuilder sqlBuilder = new StringBuilder(sql);  
        List<Object> params = ctx.getParams();  
        sqlBuilder.append(" VALUES ");  
        for (int i = 0; i < params.size(); i++) {  
            sqlBuilder.append("(");  
            Object param = params.get(i);  
            if (param instanceof Map) { // 当参数是一个Map时,map的key对应属性名,value对应属性值。属性名顺序需要和Entity保持一致。  
                Map<String, Object> map = (Map<String, Object>) param;  
                for (Object key : map.keySet()) { // 遍历map的key,拼接sql。  
                    sqlBuilder.append("#{" + key + ",jdbcType=" + JdbcType.class.getName().replace(".", ",").replace("JdbcType", "").replace("}", "").replace("}", "") + "},"); // 去掉JdbcType后的所有括号以及.号拼接到sql中。  
                }  
            } else { // 当参数不是Map时,直接拼接sql。属性顺序需要和Entity保持一致。  
                for (int j = 0; j < model.getColumns().size(); j++) { // 遍历Entity的所有属性,拼接sql。  
                    sqlBuilder.append("#{" + model.getColumns().get(j) + "},"); // 拼接到sql中。  
                }  
            }  
            sqlBuilder.deleteCharAt(sqlBuilder.length() - 1); // 删除最后一个逗号。  
            if (i != params.size() - 1) { // 如果不是最后一个参数,需要添加逗号隔开每个子语句。  
                sqlBuilder.append(",");  
            } else { // 是最后一个参数,不需要添加逗号隔开每个子语句。  
                sqlBuilder.append(")"); // 需要添加括号结束子语句。  
            }  
            if (i != params.size() - 1) { // 如果不是最后一个参数,需要添加逗号隔开每个子语句的左括号。  
                sqlBuilder.append(",");  
            } else { // 是最后一个参数,不需要添加逗号隔开每个子语句的左括号。  
                sqlBuilder.append(" "); // 需要添加空格结束每个子语句的左括号。  
            }  
        }  
        return sqlBuilder.toString(); // 返回拼接好的SQL语句。  
    }  
}

merci

  • Merci beaucoup d'avoir lu cet article du début à la fin, j'espère que son contenu pourra vous inspirer et vous aider. Si vous avez d'autres questions ou avez besoin de mieux comprendre, n'hésitez pas à suivre ma dynamique et à laisser un message
  • Enfin, pouvez-vous suivre l'auteur et un petit like, merci !
  • Si vous pensez que cela vaut la peine de le collectionner, vous pouvez le récupérer

おすすめ

転載: blog.csdn.net/qq_40673786/article/details/132353223