Mybatis高性能批量插入方法

当使用Mybatis大量插入时可以利用MySQL语句的特性使原来多次请求插入的语句变成一次请求,以此提高插入效率。

一般的插入方式

	//1000条数据,一条一条的插入
    @Test
    public void testInsert() {
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        long s = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            UserEntity userEntity = new UserEntity();
            userEntity.setName("my name is mybatis");
            userEntity.setPhone("13900000000");
            userMapper.testInsert(userEntity);
            System.out.println("id: " + userEntity.getId());
        }
        long e = System.currentTimeMillis();
        System.out.println("总共耗时:" + (e - s));
    }
    <insert id="testInsert" useGeneratedKeys="true" keyProperty="id">
        insert into t_user (name, phone)
        values
            (
            #{name,jdbcType=VARCHAR},
            #{phone,jdbcType=VARCHAR}
            )
    </insert>

在这里插入图片描述

优化后的批量插入方式

    @Test
    public void testBatchInsert() {
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<UserEntity> userEntityList = new ArrayList<>();
        long s = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            UserEntity userEntity = new UserEntity();
            userEntity.setName("my name is mybatis");
            userEntity.setPhone("13900000000");
            userEntityList.add(userEntity);
        }
        userMapper.testBatchInsert(userEntityList);
        for (UserEntity userEntity : userEntityList) {
            System.out.println("id: " + userEntity.getId());
        }

        long e = System.currentTimeMillis();
        System.out.println("总共耗时:" + (e - s));
    }
    <insert id="testBatchInsert" useGeneratedKeys="true" keyProperty="id">
        insert into t_user (name, phone)
        values
        <foreach collection="list" separator="," item="user">
            (
            #{user.name,jdbcType=VARCHAR},
            #{user.phone,jdbcType=VARCHAR}
            )
        </foreach>
    </insert>

在这里插入图片描述

两种方式都实现了插入语句,并且都能拿到返回值,但是普通的方式才插入1000条数据就要耗时20几秒,而优化后的插入方式则1秒都不到,并且随着插入的数据量不断增多,性能对比会更加悬殊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码拉松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值