当前位置: 代码网 > it编程>编程语言>Java > Mybatis批量新增的三种实现方式

Mybatis批量新增的三种实现方式

2024年12月14日 Java 我要评论
导入依赖 <!-- 数据库驱动 --> <dependency> <groupid>mysql</groupid>

导入依赖

 <!-- 数据库驱动 -->
        <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 驱动不同 com.mysql.jdbc.driver
# mysql 8 驱动不同com.mysql.cj.jdbc.driver、需要增加时区的配置
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;


    //测试数据
    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;
    }

//    循环插入
    @test
    public void add(){
        list<dept> textdata = textdata();//测试数据
        long start = system.currenttimemillis();//开始时间
        for(dept dept : textdata){
            deptmapper.adddept(dept);
        }
        system.out.println(system.currenttimemillis() - start);//统计时间
    }

//    foreach标签
    @test
    public void foreach(){
        list<dept> textdata = textdata();//测试数据
        long start = system.currenttimemillis();//开始时间
        deptmapper.foreachadd(textdata);
        system.out.println(system.currenttimemillis() - start);//统计时间
    }

    @autowired
    private sqlsessionfactory sqlsessionfactory;

    @test
    public void testinsertbatch(){

        list<dept> textdata = textdata();//测试数据
        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);//统计时间
    }
}

总结

其实实际意义上来说,包括在程序里面for循环还是在sql里面for循环都不算是批量操作。

只有将executortype设置为batch模式才是真正意义上的批量操作。

并且事实证明在sql循环时设置batch与否其实执行时间差别不是很大,几乎可以忽略不计。

所以其实如果不是特别要求性能。可以直接在sql中使用for循环即可。

谨慎使用batch,如果需要使用batch,请在需要的函数上面设置batch,不要全局使用。

因为batch也是有副作用的。比如在insert操作时,在事务没有提交之前,是没有办法获取到自增的id,此外,对于update、delete无法返回更新、插入条数。这在某型情形下是不符合业务要求的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com