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

mybatis中的三種批量插入方式對比

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

1.表結構

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 '刪除標示',
  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
#定義最長等待時間
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>
    <!-- 獲取連接最大等待時間-->
    <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"/>
    <!-- 自動掃描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>
<!-- 事務管理 -->
<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默認接受sql的大小是 1048576(1M), 即第三種方式若數(shù)據(jù)量超過1M會報如下異常:(可通過調整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.

結果對比:

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

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

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

相關文章

  • mysql的語句查詢順序、耗時分析以及查詢調優(yōu)技巧分享

    mysql的語句查詢順序、耗時分析以及查詢調優(yōu)技巧分享

    文章詳細介紹了MySQL中SQL查詢語句的執(zhí)行順序、耗時分析及查詢調優(yōu)方法,包括使用EXPLAIN、SHOW PROFILE和慢查詢日志等工具進行耗時分析,以及使用索引、避免全表掃描、優(yōu)化查詢語句、分區(qū)表和調整服務器配置等技巧進行性能優(yōu)化
    2025-02-02
  • Mysql徹底解決中文亂碼問題的方案(Illegal mix of collations for operation)

    Mysql徹底解決中文亂碼問題的方案(Illegal mix of collations for operation)

    mysql數(shù)據(jù)庫和中文支持很不友好,經常見到“Illegal mix of collations for operation”錯誤,該如何解決呢?下面小編給大家?guī)砹薽ysql數(shù)據(jù)庫中涉及到哪些字符集及徹底解決中文亂碼的解決方案,非常不錯,一起看看吧
    2016-08-08
  • MySQL的配置文件詳解及實例代碼

    MySQL的配置文件詳解及實例代碼

    MySQL的配置文件是服務器運行的重要組成部分,用于設置服務器操作的各種參數(shù),下面這篇文章主要介紹了MySQL配置文件的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-08-08
  • 教你3個步驟為Mysql添加只讀賬號

    教你3個步驟為Mysql添加只讀賬號

    只要公司有數(shù)據(jù)團隊的那免不了讓這幫家伙把全公司的數(shù)據(jù)庫數(shù)據(jù)都摸一遍,但是要是直接把root用戶給了他們有點危險,于是只能給設權限,這篇文章主要給大家介紹了關于如何通過3個步驟為Mysql添加只讀賬號的相關資料,需要的朋友可以參考下
    2023-12-12
  • MySQL表和列、增刪改查語句及數(shù)據(jù)類型約束示例詳解

    MySQL表和列、增刪改查語句及數(shù)據(jù)類型約束示例詳解

    MySQL數(shù)據(jù)庫的增刪改查操作,這可是每個軟件測試工程師的必備技能,下面這篇文章主要介紹了MySQL表和列、增刪改查語句及數(shù)據(jù)類型約束的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-02-02
  • mysql中的int(5)到底有是多長

    mysql中的int(5)到底有是多長

    這篇文章主要介紹了mysql中的int(5)到底有是多長,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Mysql數(shù)據(jù)庫之索引優(yōu)化

    Mysql數(shù)據(jù)庫之索引優(yōu)化

    MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經成為絕大多數(shù)互聯(lián)網公司的首選關系型數(shù)據(jù)庫。本文給大家介紹mysql數(shù)據(jù)庫之索引優(yōu)化,感興趣的朋友一起學習吧
    2016-03-03
  • Linux手動部署遠程的mysql數(shù)據(jù)庫的方法詳解

    Linux手動部署遠程的mysql數(shù)據(jù)庫的方法詳解

    這篇文章主要介紹了Linux手動部署遠程的mysql數(shù)據(jù)庫的方法詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • MySQL獲取binlog的開始時間和結束時間(最新方法)

    MySQL獲取binlog的開始時間和結束時間(最新方法)

    這篇文章主要介紹了MySQL如何獲取binlog的開始時間和結束時間,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 解決mysql服務器在無操作超時主動斷開連接的情況

    解決mysql服務器在無操作超時主動斷開連接的情況

    這篇文章主要介紹了解決mysql服務器在無操作超時主動斷開連接的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

连云港市| 永兴县| 珲春市| 秀山| 恩平市| 资中县| 定兴县| 中超| 九龙城区| 顺昌县| 樟树市| 南汇区| 庄河市| 长白| 大庆市| 丰台区| 仲巴县| 宁德市| 屯留县| 广西| 朝阳县| 琼结县| 沂南县| 梁山县| 安仁县| 吴江市| 金塔县| 阿坝| 尉氏县| 将乐县| 五寨县| 清丰县| 平和县| 洛扎县| 敖汉旗| 凤凰县| 白银市| 三门峡市| 绥芬河市| 平果县| 湟源县|