mybatis学习之路mysql批量新增数据的方法

 更新时间:2019年02月01日 14:18:16   作者:第一小菜鸟  
这篇文章主要介绍了mybatis学习之路mysql批量新增数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到。

mysql新增语句  

insert into 表名(字段,字段。。。) values ( 值,值 。。。);此种适合单条插入。

批量插入,一种可以在代码中循环着执行上面的语句,但是这种效率太差,下面会有对比,看看它有多差。

另一种,可以用mysql支持的批量插入语句,

insert into 表名(字段,字段。。。) values ( 值,值 。。。),( 值,值 。。。),( 值,值 。。。)....

这种方式相比起来,更高效。

下面开始来实现。

 <!-- 跟普通的insert没有什么不同的地方 ,主要用来跟下面的批量插入做对比。-->
  <insert id="insert" parameterType="com.soft.mybatis.model.Customer">
    <!-- 跟自增主键方式相比,这里的不同之处只有两点
          1 insert语句需要写id字段了,并且 values里面也不能省略
          2 selectKey 的order属性需要写成BEFORE 因为这样才能将生成的uuid主键放入到model中,
          这样后面的insert的values里面的id才不会获取为空
       跟自增主键相比就这点区别,当然了这里的获取主键id的方式为 select uuid()
       当然也可以另写别生成函数。-->
    <selectKey keyProperty="id" order="BEFORE" resultType="String">
      select uuid()
    </selectKey>
    insert into t_customer (id,c_name,c_sex,c_ceroNo,c_ceroType,c_age)
    values (#{id},#{name},#{sex},#{ceroNo},#{ceroType},#{age})
  </insert>
 
  <!-- 批量插入, -->
  <insert id="batchInsert" parameterType="java.util.Map">
    <!-- 这里只做演示用,真正项目中不会写的这么简单。 -->
    insert into
     t_customer (id,c_name,c_sex,c_ceroNo,c_ceroType,c_age)
    values
    <!-- foreach mybatis循环集合用的
       collection="list" 接收的map集合中的key 用以循环key对应的属性
         separator="," 表示每次循环完毕,在sql后面放一个逗号
         item="cus" 每次循环的实体对象 名称随意-->
    <foreach collection="list" separator="," item="cus">
      <!-- 组装values对象,因为这张表的主键为非自增主键,所以这里 (select uuid()) 用于生成id的值-->
      ((select uuid()),#{cus.name},#{cus.sex},#{cus.ceroNo},#{cus.ceroType},#{cus.age})
    </foreach>
  </insert>

实体model对象

package com.soft.mybatis.model;
 
/**
 * Created by xuweiwei on 2017/9/10.
 */
public class Customer {
 
  private String id;
  private String name;
  private Integer age;
  private Integer sex;
  private String ceroNo;
  private Integer ceroType;
 
  public String getId() {
    return id;
  }
 
  public void setId(String id) {
    this.id = id;
  }
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  public Integer getAge() {
    return age;
  }
 
  public void setAge(Integer age) {
    this.age = age;
  }
 
  public Integer getSex() {
    return sex;
  }
 
  public void setSex(Integer sex) {
    this.sex = sex;
  }
 
  public String getCeroNo() {
    return ceroNo;
  }
 
  public void setCeroNo(String ceroNo) {
    this.ceroNo = ceroNo;
  }
 
  public Integer getCeroType() {
    return ceroType;
  }
 
  public void setCeroType(Integer ceroType) {
    this.ceroType = ceroType;
  }
 
  @Override
  public String toString() {
    return "Customer{" +
        "id='" + id + '\'' +
        ", name='" + name + '\'' +
        ", age=" + age +
        ", sex=" + sex +
        ", ceroNo='" + ceroNo + '\'' +
        ", ceroType='" + ceroType + '\'' +
        '}';
  }
}

接口

int add(Customer customer);
int batchInsert(Map<String,Object> param);

实现

 /**
   * 新增数据
   * @param customer
   * @return
   */
  public int add(Customer customer) {
    return insert("customer.insert", customer);
  }
 
  /**
   * 批量插入数据
   * @param param
   * @return
   */
  public int batchInsert(Map<String,Object> param) {
    return insert("customer.batchInsert", param);
  }
 
  /**
   * 公共部分
   * @param statementId
   * @param obj
   * @return
   */
  private int insert(String statementId, Object obj){
    SqlSession sqlSession = null;
    try {
      sqlSession = SqlsessionUtil.getSqlSession();
      int key = sqlSession.insert(statementId, obj);
      // commit
      sqlSession.commit();
      return key;
    } catch (Exception e) {
      sqlSession.rollback();
      e.printStackTrace();
    } finally {
      SqlsessionUtil.closeSession(sqlSession);
    }
    return 0;
  }

测试类

 @Test
  public void add() throws Exception {
    Long start = System.currentTimeMillis();
    for(int i=0;i<1000;i++){
      Customer customer = new Customer();
      customer.setName("普通一条条插入 "+ i);
      customer.setAge(15);
      customer.setCeroNo("000000000000"+ i);
      customer.setCeroType(2);
      customer.setSex(1);
      int result = customerDao.add(customer);
    }
    System.out.println("耗时 : "+(System.currentTimeMillis() - start));
  }
 
  @Test
  public void batchInsert() throws Exception {
    Map<String,Object> param = new HashMap<String,Object>();
    List<Customer> list = new ArrayList<Customer>();
    for(int i=0;i<1000;i++){
      Customer customer = new Customer();
      customer.setName("批量插入" + i);
      customer.setAge(15);
      customer.setCeroNo("111111111111"+i);
      customer.setCeroType(2);
      customer.setSex(1);
      list.add(customer);
    }
    param.put("list",list);
    Long start = System.currentTimeMillis();
    int result = customerDao.batchInsert(param);
    System.out.println("耗时 : "+(System.currentTimeMillis() - start));
  }

两种都进行插入1000条测试

由于我没有用连接池等等原因,在插入了700多条的时候 junit直接挂了,

Cause: org.apache.ibatis.executor.ExecutorException: Error selecting key or setting result to parameter object.

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:

Data source rejected establishment of connection,  message from server: "Too many connections"


数据库插入结果:


但是第二种仅仅用了2秒多就ok了。可见这种效率很高。


数据库结果


这里写了两个,其实第一种仅仅是做对比效率用。

批量新增数据记录完毕。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解决Eclipse配置Tomcat出现Cannot create a server using the selected type错误

    解决Eclipse配置Tomcat出现Cannot create a server using the selected

    这篇文章主要介绍了解决Eclipse配置Tomcat出现Cannot create a server using the selected type错误的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java中设置session超时(失效)的三种方法

    Java中设置session超时(失效)的三种方法

    这篇文章主要介绍了Java中设置session超时(失效)的三种方法,本文讲解了在web容器中设置、在工程的web.xml中设置、通过java代码设置3种方法,需要的朋友可以参考下
    2015-07-07
  • 详解Java利用深度优先遍历解决迷宫问题

    详解Java利用深度优先遍历解决迷宫问题

    深度优先遍历:深度优先遍历是图论中的经典算法。其利用了深度优先搜索算法可以产生目标图的相应拓扑排序表,采用拓扑排序表可以解决很多相关的图论问题,如最大路径问题等等。本文将利用深度优先遍历解决迷宫问题,感兴趣的可以了解一下
    2022-02-02
  • Java解析调用webservice服务的返回XML串详解

    Java解析调用webservice服务的返回XML串详解

    这篇文章主要介绍了Java解析调用webservice服务的返回XML串详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 详解java平台解析协议相关备忘

    详解java平台解析协议相关备忘

    这篇文章主要介绍了详解java平台解析协议相关备忘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java并发学习之BlockingQueue实现生产者消费者详解

    java并发学习之BlockingQueue实现生产者消费者详解

    这篇文章主要介绍了java并发学习之BlockingQueue实现生产者消费者详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 通过实例了解Java jdk和jre的区别

    通过实例了解Java jdk和jre的区别

    这篇文章主要介绍了通过实例了解Java jdk和jre的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Redisson RedLock红锁加锁实现过程及原理

    Redisson RedLock红锁加锁实现过程及原理

    本文主要介绍了Redis中Redisson红锁(Redlock)使用原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Java Switch对各类型支持实现原理

    Java Switch对各类型支持实现原理

    这篇文章主要介绍了Java Switch对各类型支持实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • linux配置jdk环境变量简单教程

    linux配置jdk环境变量简单教程

    这篇文章主要为大家详细介绍了linux配置jdk环境变量简单教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论