欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis中的三種批量插入方式對(duì)比

 更新時(shí)間:2023年10月08日 09:42:18   作者:談笑_風(fēng)生  
這篇文章主要介紹了mybatis中的三種批量插入方式對(duì)比,Mybatis是一款流行的Java持久化框架,它提供了三種不同的批量插入方式,分別為普通循環(huán)插入、BatchExecutor和JDBC批處理,普通循環(huán)插入方式適用于數(shù)據(jù)量較小的情況,但隨著數(shù)據(jù)量的增大會(huì)影響性能,需要的朋友可以參考下

1.表結(jié)構(gòu)

CREATE TABLE `t_user` (
  `id` varchar(32) CHARACTER SET utf8 NOT NULL COMMENT '主鍵',
  `name` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '用戶名',
  `del_flag` char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT '刪除標(biāo)示',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

2.配置

 2.1 jdbc.properties配置

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/ssm
mysql.username=root
mysql.password=admin
#定義初始連接數(shù)
mysql.initialSize=1
#定義最大連接數(shù)
mysql.maxActive=20
#定義最大空閑
mysql.maxIdle=20
#定義最小空閑
mysql.minIdle=1
#定義最長等待時(shí)間
mysql.maxWait=60000

2.2 spring-mybatis.xml配置

<context:component-scan base-package="com.win.ssm"/>
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${mysql.driver}"/>
    <property name="url" value="${mysql.url}"/>
    <property name="username" value="${mysql.username}"/>
    <property name="password" value="${mysql.password}"/>
    <!-- 初始化鏈接大小-->
    <property name="initialSize" value="${mysql.initialSize}"/>
    <!-- 連接池最大數(shù)量-->
    <property name="maxActive" value="${mysql.maxActive}"/>
    <!-- 連接池最大空閑-->
    <property name="maxIdle" value="${mysql.maxIdle}"/>
    <!-- 連接池最小空閑 -->
    <property name="minIdle" value="${mysql.minIdle}"></property>
    <!-- 獲取連接最大等待時(shí)間-->
    <property name="maxWait" value="${mysql.maxWait}"/>
</bean>
<!-- spring與mybatis整合類 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!-- 查找接口的別名 -->
    <property name="typeAliasesPackage" value="com.win"/>
    <!-- 自動(dòng)掃描mapping.xml文件-->
    <property name="mapperLocations" value="classpath:/mapping/*.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
    <!--<constructor-arg index="1" value="BATCH" />-->
</bean>
<!-- 掃描DAO接口 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.win.ssm.dao"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- 事務(wù)管理 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

3.插入方式

第一種:普通for循環(huán)插入

 ①junit類

@Test
public void testInsertBatch2() throws Exception {
    long start = System.currentTimeMillis();
    User user;
    SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(false);
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    for (int i = 0; i < 500; i++) {
        user = new User();
        user.setId("test" + i);
        user.setName("name" + i);
        user.setDelFlag("0");
        mapper.insert(user);
    }
    sqlSession.commit();
    long end = System.currentTimeMillis();
    System.out.println("---------------" + (start - end) + "---------------");
}

 ②xml配置

<insert id="insert">
    INSERT INTO t_user (id, name, del_flag)
          VALUES(#{id}, #{name}, #{delFlag})
</insert>

第二種:mybatis BATCH模式插入

 ①junit類

@Test
public void testInsertBatch2() throws Exception {
    long start = System.currentTimeMillis();
    User user;
    SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);//跟上述sql區(qū)別
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    for (int i = 0; i < 500; i++) {
        user = new User();
        user.setId("test" + i);
        user.setName("name" + i);
        user.setDelFlag("0");
        mapper.insert(user);
    }
    sqlSession.commit();
    long end = System.currentTimeMillis();
    System.out.println("---------------" + (start - end) + "---------------");
}

  ②xml配置與第一種②中使用相同

第三種:foreach方式插入

 ①junit類

@Test
public void testInsertBatch() throws Exception {
    long start = System.currentTimeMillis();
    List<User> list = new ArrayList<>();
    User user;
    for (int i = 0; i < 10000; i++) {
        user = new User();
        user.setId("test" + i);
        user.setName("name" + i);
        user.setDelFlag("0");
        list.add(user);
    }
    userService.insertBatch(list);
    long end = System.currentTimeMillis();
    System.out.println("---------------" + (start - end) + "---------------");
}

②xml配置

<insert id="insertBatch">
    INSERT INTO t_user
            (id, name, del_flag)
    VALUES
    <foreach collection ="list" item="user" separator =",">
         (#{user.id}, #{user.name}, #{user.delFlag})
    </foreach >
</insert>

特別注意:

mysql默認(rèn)接受sql的大小是 1048576(1M), 即第三種方式若數(shù)據(jù)量超過1M會(huì)報(bào)如下異常:(可通過調(diào)整MySQL安裝目錄下的my.ini文件中[mysqld]段的"max_allowed_packet = 1M")

nested exception is com.mysql.jdbc.PacketTooBigException: Packet for query is too large (5677854 > 1048576).

You can change this value on the server by setting the max_allowed_packet' variable.

結(jié)果對(duì)比:

條數(shù)第一種第二種第三種
500條77427388622
1000條1529015078746
5000條780111773501172
10000條3974722011801205

時(shí)間有限測試數(shù)據(jù)較少,有興趣可以自己測試以下。(不清楚為什么BATCH有時(shí)候比單條循環(huán)插入還耗時(shí)間,請(qǐng)知道的大神不吝賜教,感謝!)

到此這篇關(guān)于mybatis中的三種批量插入方式對(duì)比的文章就介紹到這了,更多相關(guān)mybatis三種批量插入方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql修改server uuid的方法分享

    Mysql修改server uuid的方法分享

    這篇文章主要給大家介紹了關(guān)于Mysql修改server uuid的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • MySQL 連接查詢的原理和應(yīng)用

    MySQL 連接查詢的原理和應(yīng)用

    這篇文章主要介紹了MySQL 連接查詢的原理和應(yīng)用,幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-11-11
  • MySQL主從配置及haproxy和keepalived搭建過程解析

    MySQL主從配置及haproxy和keepalived搭建過程解析

    這篇文章主要介紹了MySQL主從配置及haproxy和keepalived搭建,本次運(yùn)行環(huán)境是在docker中,也會(huì)介紹一些docker的知識(shí),需要的朋友可以參考下
    2022-05-05
  • MySQL 8.0.19安裝詳細(xì)教程(windows 64位)

    MySQL 8.0.19安裝詳細(xì)教程(windows 64位)

    這篇文章主要介紹了MySQL 8.0.19安裝詳細(xì)教程(windows 64位),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程

    生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程

    這篇文章主要介紹了生產(chǎn)環(huán)境MySQL索引時(shí)效的排查過程,文章根據(jù)SQL查詢耗時(shí)特別長,看了執(zhí)行計(jì)劃發(fā)現(xiàn)沒有走索引的問題展開詳細(xì)介紹,需要的朋友可以參考一下
    2022-04-04
  • 淺析Mysql Join語法以及性能優(yōu)化

    淺析Mysql Join語法以及性能優(yōu)化

    在講MySQL的Join語法前還是先回顧一下聯(lián)結(jié)的語法,呵呵,其實(shí)連我自己都忘得差不多了,那就大家一起溫習(xí)吧,這里我有個(gè)比較簡便的記憶方法,內(nèi)外聯(lián)結(jié)的區(qū)別是內(nèi)聯(lián)結(jié)將去除所有不符合條件的記錄,而外聯(lián)結(jié)則保留其中部分。外左聯(lián)結(jié)與外右聯(lián)結(jié)的區(qū)別在于如果用A左聯(lián)結(jié)B則A中所有記錄都會(huì)保留在結(jié)果中,此時(shí)B中只有符合聯(lián)結(jié)條件的記錄,而右聯(lián)結(jié)相反,這樣也就不會(huì)混淆了。
    2014-05-05
  • mysql執(zhí)行腳本導(dǎo)入表和數(shù)據(jù)后中文注釋亂碼的問題解決

    mysql執(zhí)行腳本導(dǎo)入表和數(shù)據(jù)后中文注釋亂碼的問題解決

    本人在使用不同版本下進(jìn)行操作時(shí),就會(huì)出現(xiàn)中文亂碼的問題,,例如我本地安裝mysql8,服務(wù)器安裝的是mysql5,然后本地連接服務(wù)器的mysql后,執(zhí)行SQL腳本之后發(fā)現(xiàn)中文全部亂碼,所以本文介紹了mysql執(zhí)行腳本導(dǎo)入表和數(shù)據(jù)后中文注釋亂碼的問題解決,需要的朋友可以參考下
    2024-04-04
  • MySQL5.7.10 安裝文檔教程詳解

    MySQL5.7.10 安裝文檔教程詳解

    這篇文章主要介紹了MySQL5.7.10 安裝文檔教程詳解,需要的朋友可以參考下
    2017-02-02
  • mysql實(shí)現(xiàn)事務(wù)的提交與回滾的實(shí)例詳解

    mysql實(shí)現(xiàn)事務(wù)的提交與回滾的實(shí)例詳解

    在本篇文章中我們給大家分享一篇關(guān)于mysql實(shí)現(xiàn)事務(wù)的提交與回滾的實(shí)例內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-01-01
  • MySQL 5.0.96 for Windows x86 32位綠色精簡版安裝教程

    MySQL 5.0.96 for Windows x86 32位綠色精簡版安裝教程

    這篇文章主要介紹了MySQL 5.0.96 for Windows x86 32位綠色精簡版安裝教程,需要的朋友可以參考下
    2017-10-10

最新評(píng)論