一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

mybatis三種批量插入方式對(duì)比【面試+工作】

 Java幫幫 2020-01-02



準(zhǔn)備:  

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

#定義最長(zhǎng)等待時(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>

    第一種:普通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í)間有限測(cè)試數(shù)據(jù)較少,有興趣可以自己測(cè)試以下。(不清楚為什么BATCH有時(shí)候比單條循環(huán)插入還耗時(shí)間,請(qǐng)知道的大神不吝賜教,感謝?。?/span>

      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      亚洲一区二区三区有码| 欧美极品欧美精品欧美| 欧美在线观看视频免费不卡| 国产高清一区二区不卡| 日韩一区二区三区18| 日本丰满大奶熟女一区二区| 精品一区二区三区免费看| 国产欧美一区二区色综合| 国产精品自拍杆香蕉视频| 色涩一区二区三区四区| 欧美日韩国产精品第五页| 美女露小粉嫩91精品久久久| 很黄很污在线免费观看| 欧美一二三区高清不卡| 欧美乱视频一区二区三区| 一级片黄色一区二区三区| 国产精品视频一级香蕉| 国产精品福利一二三区| 日韩精品一级片免费看| 亚洲精品国产第一区二区多人| 日本人妻丰满熟妇久久| 亚洲一区二区精品免费| 丰满人妻一二区二区三区av| 东京热男人的天堂一二三区| 日韩少妇人妻中文字幕| 九九热国产这里只有精品| 国内精品偷拍视频久久| 粗暴蹂躏中文一区二区三区| 免费福利午夜在线观看| 东京热加勒比一区二区| 国产精品免费视频久久| 国产真人无遮挡免费视频一区| 欧美日韩国产精品黄片| 99久久精品午夜一区二区| 久久精品久久久精品久久| 亚洲精品一二三区不卡| 国产女高清在线看免费观看| 久久经典一区二区三区| 欧美国产在线观看精品| 亚洲少妇人妻一区二区| 国产av乱了乱了一区二区三区|