• mybatis批量新增


    MyBatis简介

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

    一、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了

    具体用法如下:

    1
    2
    3
    4
    5
    6
    <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 的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    //获取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别名最好是包名+类名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    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中批量插入的两种方式(高效插入),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 相关阅读:
    消息队列之kafka
    注册中心ZooKeeper
    消息队列之RocketMQ集群部署
    消息队列之RocketMQ简介及单机部署
    消息队列之RabbitMQ
    消息队列简介
    debian10入门(切换root用户,更改网卡配置,及更新apt源配置)
    实体间的关系
    MySQL数据库的基础使用命令大全
    ReletiveLayout布局的一些常用属性
  • 原文地址:https://www.cnblogs.com/k-iss/p/6681597.html
Copyright © 2020-2023  润新知