最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis批量新增的三種實現(xiàn)方式

 更新時間:2024年12月13日 14:15:51   作者:摩爾多0  
文章講述了在Java中進行批量操作的最佳實踐,包括使用MyBatis的ExecutorType.BATCH模式,作者建議根據(jù)實際需求選擇是否進行批量操作,因為批量操作并不總是能提升性能,且有副作用,如無法獲取自增ID等

導入依賴

 <!-- 數(shù)據(jù)庫驅(qū)動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

        <!--        web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

Dao

@Repository // 代表持久層
public interface DeptMapper  {

    int addDept(Dept dept);

    int foreachAdd(List<Dept> list);
}

記得在啟動類上加

@MapperScan(“com.example.demo.dao”)

DeptMapper.xml

<?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.example.demo.dao.DeptMapper">


<!--普通新增-->
    <insert id="addDept" parameterType="com.example.demo.pojo.Dept">
        INSERT INTO dept (dname, db_source) VALUES (#{dname},#{dbSource})
    </insert>


    <!--foreachMySql寫法-->
    <insert id="foreachAdd"  parameterType="java.util.List">
        insert into dept (
        dname,
        db_source

        )
        values
        <foreach collection="list" item="dept" index="index" separator="," >
            (
            #{dept.dname,jdbcType=VARCHAR},
            #{dept.dbSource,jdbcType=VARCHAR}

            )
        </foreach>
    </insert>


</mapper>

實體類

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
  private long deptno;
  private String dname;
  private String dbSource;
}

配置文件

# mysql 5 驅(qū)動不同 com.mysql.jdbc.Driver
# mysql 8 驅(qū)動不同com.mysql.cj.jdbc.Driver、需要增加時區(qū)的配置
serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/db01?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

mybatis-plus.mapper-locations=classpath:mapping/*Mapper.xml

核心測試類

@SpringBootTest
class DemoApplicationTests {


    @Autowired
    private DeptMapper deptMapper;


    //測試數(shù)據(jù)
    public List<Dept> textData(){
        ArrayList<Dept> deptList = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            Dept dept = new Dept();
            dept.setDname("foreach");
            dept.setDbSource("db02");
            deptList.add(dept);
        }
        return deptList;
    }

//    循環(huán)插入
    @Test
    public void add(){
        List<Dept> textData = textData();//測試數(shù)據(jù)
        long start = System.currentTimeMillis();//開始時間
        for(Dept dept : textData){
            deptMapper.addDept(dept);
        }
        System.out.println(System.currentTimeMillis() - start);//統(tǒng)計時間
    }

//    foreach標簽
    @Test
    public void foreach(){
        List<Dept> textData = textData();//測試數(shù)據(jù)
        long start = System.currentTimeMillis();//開始時間
        deptMapper.foreachAdd(textData);
        System.out.println(System.currentTimeMillis() - start);//統(tǒng)計時間
    }

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Test
    public void testInsertBatch(){

        List<Dept> textData = textData();//測試數(shù)據(jù)
        long start = System.currentTimeMillis();//開始時間
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        DeptMapper studentMapperNew = sqlSession.getMapper(DeptMapper.class);
        textData.stream().forEach(student -> studentMapperNew.addDept(student));
        sqlSession.commit();
        sqlSession.clearCache();
        System.out.println(System.currentTimeMillis() - start);//統(tǒng)計時間
    }
}

總結(jié)

其實實際意義上來說,包括在程序里面for循環(huán)還是在sql里面for循環(huán)都不算是批量操作。

只有將ExecutorType設(shè)置為BATCH模式才是真正意義上的批量操作。

并且事實證明在sql循環(huán)時設(shè)置batch與否其實執(zhí)行時間差別不是很大,幾乎可以忽略不計。

所以其實如果不是特別要求性能??梢灾苯釉趕ql中使用for循環(huán)即可。

謹慎使用batch,如果需要使用batch,請在需要的函數(shù)上面設(shè)置batch,不要全局使用。

因為batch也是有副作用的。比如在Insert操作時,在事務沒有提交之前,是沒有辦法獲取到自增的id,此外,對于update、delete無法返回更新、插入條數(shù)。這在某型情形下是不符合業(yè)務要求的。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringCloud項目集成Feign、Hystrix過程解析

    SpringCloud項目集成Feign、Hystrix過程解析

    這篇文章主要介紹了SpringCloud項目集成Feign、Hystrix過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Spring Boot 把配置文件和日志文件放到jar外部

    Spring Boot 把配置文件和日志文件放到jar外部

    如果不想使用默認的application.properties,而想將屬性文件放到jar包外面,怎么做呢?下面小編給大家?guī)砹藘煞N方法解決Spring Boot 把配置文件和日志文件放到jar外部問題,感興趣的朋友一起看看吧
    2018-02-02
  • Java詳細講解堆排序與時間復雜度的概念

    Java詳細講解堆排序與時間復雜度的概念

    本文主要介紹了java實現(xiàn)堆排序以及時間復雜度,堆排序這種排序算法是我們經(jīng)常用到的,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Required?request?body?is?missing的問題及解決

    Required?request?body?is?missing的問題及解決

    這篇文章主要介紹了Required?request?body?is?missing的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解關(guān)于spring bean名稱命名的那些事

    詳解關(guān)于spring bean名稱命名的那些事

    每個bean都有一個或者多個標識符,這些標識符在容器中必須是唯一的,這篇文章主要給大家介紹了關(guān)于spring bean名稱命名的那些事,需要的朋友可以參考下
    2021-07-07
  • Java enum的用法詳細介紹及實例代碼

    Java enum的用法詳細介紹及實例代碼

    這篇文章主要介紹了Java enum的用法詳細介紹及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 簡單介紹線性表以及如何實現(xiàn)雙鏈表

    簡單介紹線性表以及如何實現(xiàn)雙鏈表

    本文先介紹線性表的幾個基本組成部分:數(shù)組、單向鏈表、雙向鏈表;隨后給出雙向鏈表的C、C++和Java三種語言的實現(xiàn),需要的朋友可以參考下
    2015-07-07
  • Java8中常見函數(shù)式接口的使用示例詳解

    Java8中常見函數(shù)式接口的使用示例詳解

    在 Java 8 中,函數(shù)式接口是一個關(guān)鍵的特性,它們允許將方法作為參數(shù)傳遞或返回類型,本文為大家整理了一些常見的函數(shù)式接口的使用,希望對大家有所幫助
    2023-12-12
  • SpringData JPA快速上手之關(guān)聯(lián)查詢及JPQL語句書寫詳解

    SpringData JPA快速上手之關(guān)聯(lián)查詢及JPQL語句書寫詳解

    JPA都有SpringBoot的官方直接提供的starter,而Mybatis沒有,直到SpringBoot 3才開始加入到官方模版中,這篇文章主要介紹了SpringData JPA快速上手,關(guān)聯(lián)查詢,JPQL語句書寫的相關(guān)知識,感興趣的朋友一起看看吧
    2023-09-09
  • 解決對接JAVA SM2加密遇到的坑

    解決對接JAVA SM2加密遇到的坑

    這篇文章主要介紹了解決對接JAVA SM2加密遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

皮山县| 英超| 桐梓县| 宁远县| 伊吾县| 青阳县| 菏泽市| 饶平县| 丘北县| 泰兴市| 晋城| 眉山市| 宣恩县| 郑州市| 三门县| 尤溪县| 丹巴县| 浪卡子县| 平泉县| 宜城市| 景德镇市| 搜索| 托克托县| 江永县| 招远市| 四会市| 赞皇县| 乾安县| 榆社县| 土默特右旗| 调兵山市| 赫章县| 牟定县| 昌江| 晴隆县| 鄄城县| 时尚| 西藏| 德令哈市| 双鸭山市| 荣成市|