1. 程式人生 > 其它 >mybatis批量新增和批量修改,批量刪除

mybatis批量新增和批量修改,批量刪除

mybatis批量新增

<insert id="addBatch" parameterType="java.util.List">
        INSERT INTO ip_message(ip,ip_content,ip_time)
        VALUE
        <foreach collection="list" item="item" separator=",">
            (#{item.ip},#{item.ipContent},#{item.ipTime})
        </foreach>
    </insert>

  

int addBatch(List<QueryIpBean> queryIpBeanList);

  mybatis批量修改

&allowMultiQueries=true

<update id="updateBatch" parameterType="java.util.List">
          <foreach collection="list" item="item" separator=";">
              UPDATE ip_message SET ip_content=#{item.ipContent} WHERE ip=#{item.ip}
          </foreach>
    </update>


int updateBatch(List<QueryIpBean> queryIpBeanList);

  

 mybatis批量刪除

在使用in的過程中,使用int型別資料,會走索引,但是效率低

  

in使用varchar型別查詢,會全表掃描

因此刪除的時候,最好使用走索引的方式批量刪除資料

<delete id="delBatch" parameterType="java.util.List">
        DELETE   FROM ip_message WHERE id IN
        <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

  

int delBatch(List<Integer> idLists);

  

以下是完整程式碼

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.mysql</groupId>
    <artifactId>mysql-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <!--lombok依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>


</project>

  

server.port=3307


logging.level.com.java=debug
logging.level.web=debug
spring.devtools.add-properties=false


spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/yourheart-dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=classpath:mapping/*.xml

  

package com.java;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author yourheart
 * @Description
 * @create 2022-05-14 23:53
 */
@SpringBootApplication
@MapperScan(basePackages = "com.java.mapper")
public class MysqlApplication {
    public static void main(String[] args) {
        SpringApplication.run(MysqlApplication.class, args);
    }
}

  

package com.java.bean;

import lombok.Builder;
import lombok.Data;

/**
 * @author yourheart
 * @Description
 * @create 2021-11-23 22:03
 */
@Data
@Builder
public class QueryIpBean {

    /**
     * 主鍵
     */
    private String id;
    /**
     * ip地址
     */
    private String ip;
    /**
     * ip地址的詳細資訊
     */
    private String ipContent;
    /**
     * ip資訊儲存時間
     */
    private String ipTime;
}

  

package com.java.utils;


import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 作者 邱燮
 * 時間: 2020/5/27 14:35
 * 描述
 */
@Slf4j
public class TimeUtils {

    //獲取當前時間
    public static String getTime() {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sdf.format(date);
        return format;
    }

    /**
     * 獲取哪一天
     * @return
     */
    public static String getDay() {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(date);
        return format;
    }

    /**
     * 獲取哪一年
     * @return
     */
    public static String getYear() {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        String format = sdf.format(date);
        return format;
    }
}

  

package com.java.mapper;

import com.java.bean.QueryIpBean;

import java.util.List;

public interface QueryIpMapper {

    /**
     * 查詢ip表的所有資料
     * @return
     */
    List<QueryIpBean> getIpMessageList();

    /**
     * 批量插入資料
     * @param queryIpBeanList
     * @return
     */
    int addBatch(List<QueryIpBean> queryIpBeanList);

    int addBatchs(List<QueryIpBean> queryIpBeanList);

    /**
     * 單條資料插入
     * @param queryIpBean
     * @return
     */
    int addIpMessage(QueryIpBean queryIpBean);

    /**
     * 批量修改資料
     * @param queryIpBeanList
     * @return
     */
    int updateBatch(List<QueryIpBean> queryIpBeanList);

    /**
     * 批量刪除資料
     * @param idLists
     * @return
     */
    int delBatch(List<Integer> idLists);
}

  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java.mapper.QueryIpMapper">

    <select id="getIpMessageList" resultType="com.java.bean.QueryIpBean">
        SELECT  *  FROM  ip_message  ORDER BY ip_time DESC
    </select>

    <insert id="addBatch" parameterType="java.util.List">
        INSERT INTO ip_message(ip,ip_content,ip_time)
        VALUE
        <foreach collection="list" item="item" separator=",">
            (#{item.ip},#{item.ipContent},#{item.ipTime})
        </foreach>
    </insert>

    <insert id="addBatchs" parameterType="java.util.List">
        INSERT INTO ip_message(ip,ip_content,ip_time)
        VALUES
        <foreach collection="list" item="item"  separator=",">
            (#{item.ip},#{item.ipContent},#{item.ipTime})
        </foreach>
    </insert>

    <insert id="addIpMessage" parameterType="com.java.bean.QueryIpBean">
       INSERT INTO ip_message(ip,ip_content,ip_time)
        VALUES(#{ip},#{ipContent},#{ipTime})
    </insert>


    <update id="updateBatch" parameterType="java.util.List">
          <foreach collection="list" item="item" separator=";">
              UPDATE ip_message SET ip_content=#{item.ipContent} WHERE ip=#{item.ip}
          </foreach>
    </update>

    <delete id="delBatch" parameterType="java.util.List">
        DELETE   FROM ip_message WHERE id IN
        <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>


</mapper>

  

package com.java;

import com.java.bean.QueryIpBean;
import com.java.mapper.QueryIpMapper;
import com.java.utils.TimeUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

/**
 * @author yourheart
 * @Description
 * @create 2022-05-15 0:21
 */
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class MysqlApplicationTests{

    @Autowired
    private QueryIpMapper queryIpMapper;



    @Test
    public void delBatch(){
        List<Integer> idLists=new ArrayList<>();
        idLists.add(26);
        idLists.add(25);
        idLists.add(24);
        queryIpMapper.delBatch(idLists);
    }

    public void upBatch(){
        List<QueryIpBean> ipMessageList=new ArrayList<>();
        ipMessageList.add(QueryIpBean.builder().ip("192.168.1.1").ipContent("mybatis批量修改測試003").ipTime(TimeUtils.getTime()).build());
        ipMessageList.add(QueryIpBean.builder().ip("127.0.0.1").ipContent("mybatis批量修改測試004").ipTime(TimeUtils.getTime()).build());
        queryIpMapper.updateBatch(ipMessageList);
    }

    public void batchTestAdd(){
        List<QueryIpBean> ipMessageList=new ArrayList<>();
        //100萬條資料
        for (int i=0;i<1000000;i++){
            ipMessageList.add(QueryIpBean.builder().ip("192.168.1.1").ipContent("出去浪002").ipTime(TimeUtils.getTime()).build());
        }

        long startTime = System.currentTimeMillis();
        queryIpMapper.addBatch(ipMessageList);
        long endTime=System.currentTimeMillis();
        log.info("【100萬條資料】【value批處理耗時】:{}",(endTime-startTime)+"ms");

        long startTime1 = System.currentTimeMillis();
        queryIpMapper.addBatchs(ipMessageList);
        long endTime1=System.currentTimeMillis();
        log.info("【100萬條資料】【values批處理耗時】:{}",(endTime1-startTime1)+"ms");


    }
    

    public void addIpMessage(){

        List<QueryIpBean> ipMessageList = null;
        ipMessageList.forEach(a->{
            a.setIpTime(TimeUtils.getTime());
        });
        long startTime = System.currentTimeMillis();
        ipMessageList.forEach(a->{
            queryIpMapper.addIpMessage(a);
        });
        long endTime=System.currentTimeMillis();
        log.info("【values批處理耗時】:{}",(endTime-startTime)+"ms");

    }

    public void addBatch(){
        List<QueryIpBean> ipMessageList = null;

        ipMessageList.forEach(a->{
            a.setIpTime(TimeUtils.getTime());
        });

        long startTime = System.currentTimeMillis();
        queryIpMapper.addBatch(ipMessageList);
        long endTime=System.currentTimeMillis();
        log.info("【values批處理耗時】:{}",(endTime-startTime)+"ms");
    }




    public void testLIst(){

        List<QueryIpBean> ipMessageList = queryIpMapper.getIpMessageList();
        ipMessageList.forEach(a->{
            log.info(a.toString());
        });

    }
}