`
tangkuo
  • 浏览: 100962 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

mybatis 批量插入的两种方式

 
阅读更多
一、mybiats foreach标签

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

    如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
    如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
    如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了
    具体用法如下:

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

    二、mybatis ExecutorType.BATCH

        Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的
        具体用法如下:

*方式一 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

方法二:

    结合通用mapper 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批量插入数据到Oracle数据库中的两种方式(实例代码)

    MyBatis批量插入数据到Oracle数据库中的两种方式 MyBatis是一款流行的持久层框架,提供了批量插入数据到数据库的功能。本文将通过实例代码,分享MyBatis批量插入数据到Oracle数据库中的两种方式。 第一种方式:...

    mybatis中批量插入的两种方式(高效插入)

    MyBatis是一个强大的持久层框架,它允许开发者编写SQL查询,使用存储过程,并进行高级映射,无需手动处理JDBC代码和结果集的...理解并熟练运用这两种方式,能够帮助开发者在使用MyBatis处理大数据时,提升应用的性能。

    mybatis批量添加实现1

    本文将详细介绍如何使用Mybatis进行批量插入,包括针对MySQL和Oracle两种不同数据库的实现方式。 一、Mybatis批量添加基础 Mybatis允许开发者直接传递一个集合到Mapper接口的方法中,然后在映射文件中通过`...

    mybatis数据操作(增删改查+批量操作)

    8. **事务管理**:MyBatis的事务管理可以通过编程式和声明式两种方式实现。编程式事务管理需要在代码中手动开启和提交事务,而声明式事务管理则可以通过Spring等框架自动管理。 9. **参数和结果映射**:MyBatis提供...

    mybatis批量添加数据的方法1

    MyBatis是一款流行的Java持久层框架,它提供了多种方式来批量添加数据,以下是其中两种常用的方法: 方法一:使用foreach标签 在MyBatis中,我们可以使用foreach标签来批量添加数据。foreach标签可以将一个集合...

    MyBatis批量添加、修改和删除

    示例中提供了两种方式: - 实例1: 这里通过 `id` 的集合来更新特定记录的 `name` 字段。XML 映射文件中的 `&lt;update&gt;` 标签使用 `&lt;foreach&gt;` 标签遍历 ID 集合,并将其插入到 WHERE 子句的 IN 条件中。 ```xml ...

    mybatis_insertbatch_db.rar

    总之,这个压缩包提供的学习资源涵盖了SpringBoot与MyBatis集成、MyBatis批量插入的最佳实践、以及如何通过性能测试评估和优化数据库操作。通过研究这个例子,开发者可以更好地理解如何在大数据量的情况下提高应用的...

    MyBatis的关于批量数据操作的体会

    关于数据库批量插入时sql语句级的优化,我特意测试了两种方式,在StudentMapper中配置了两种insert模式。第一种对应insert value1,insert value2,,,,;第二种对应insert values (value1, value2,....)。发现后者果然...

    mybatis-plus代码生成器的两种方式.zip

    Mybatis-Plus是一款基于Mybatis框架的扩展工具,它简化了常见的CRUD操作,提供了诸如自动填充主键、批量插入、条件构造器等便捷功能。本文将深入探讨两种Mybatis-Plus中的代码生成器——MysqlGenerator与Code...

    MyBatis批量添加数据2种实现方法

    "MyBatis批量添加数据2种实现方法" MyBatis是一款流行的Java持久层框架,它提供了多种方式来批量添加数据。今天,我们将介绍两种实现批量添加数据的方法,分别是:通过foreach标签拼接SQL语句和基于Session的...

    Mybatis实现插入数据后返回主键过程解析

    有两种方式:xml映射器和接口映射器。 ### 1.xml映射器 在xml映射器中,可以通过设置属性`useGeneratedKeys`值为`true`,并分别指定属性`keyProperty`和`keyColumn`为对应的数据库记录主键字段与Java对象的主键...

    hibernate与mybatis一起使用取长补短

    标题“hibernate与mybatis一起使用取长补短”暗示了在一个项目中同时采用这两种框架,旨在充分利用它们各自的优点,以提升项目的性能和灵活性。 Hibernate是一款强大的ORM框架,它提供了完整的对象模型支持,包括...

    MyBatis的27道面试题

    在MyBatis中,使用#{}和${}两种方式获取参数时,它们的差别主要在于:#{}是预编译处理,它会将参数预编译到SQL语句中,可以有效防止SQL注入,而${}是直接将参数拼接在SQL语句中,不推荐使用。当实体类属性与数据库...

    尚硅谷Mybatis视频教程41-50

    尚硅谷_MyBatis_动态sql_foreach_mysql下foreach批量插入的两种方式.avi** - **Foreach**:Mybatis中的Foreach标签用于循环遍历集合并生成SQL语句中的IN或JOIN子句,这里是针对MySQL环境下的批量插入。 - **两种...

    mybatis学习笔记LBY.pdf

    - **实现查询结果映射**:可以通过 XML 映射文件或注解两种方式实现。 - **XML 方式**: - 定义 POJO 类。 - 编写映射器接口。 - 使用 XML 文件创建映射器。 示例: ```java // POJO 示例 public class User {...

    Mybatis学习文件笔记.rar

    主要有以下两种方式: 1. 单次执行多条插入语句:可以在同一个SQL语句中插入多条记录,例如使用`&lt;insert&gt;`标签并结合动态SQL,通过`&lt;foreach&gt;`循环遍历数据列表,生成多条`INSERT INTO`语句,然后一次性执行。 ```...

    phoenix-mybatis-demo:凤凰-mybatis集成的一些基本知识

    这个项目旨在帮助开发者理解和实践在Java环境中使用这两种技术的组合。 【描述】:凤凰(Phoenix)是Apache HBase的一个SQL层,它允许用户通过标准的JDBC接口来查询和操作HBase数据。MyBatis则是一个优秀的Java持久...

    MyBatis3.5.4官方文档.zip

    6. **Executor执行器**:MyBatis提供了两种执行器(Simple Executor和Batch Executor),以及一种缓存执行器(Reused Executor)。执行器决定了SQL的执行策略,如是否开启缓存、是否批量提交等。 7. **插件**:...

    mybatis源码分析思维导图.rar

    MyBatis提供了本地缓存(LocalCache)和二级缓存(SecondLevelCache)两种缓存策略,能够减少不必要的数据库访问,提高系统性能。 总的来说,MyBatis源码分析思维导图会涵盖MyBatis的各个关键组件、工作流程、特性...

Global site tag (gtag.js) - Google Analytics