Mybatis批量新增的三種實現(xiàn)方式
導入依賴
<!-- 數據庫驅動 --> <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、需要增加時區(qū)的配置 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; } // 循環(huán)插入 @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);//統(tǒng)計時間 } // foreach標簽 @Test public void foreach(){ List<Dept> textData = textData();//測試數據 long start = System.currentTimeMillis();//開始時間 deptMapper.foreachAdd(textData); System.out.println(System.currentTimeMillis() - start);//統(tǒng)計時間 } @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);//統(tǒng)計時間 } }
總結
其實實際意義上來說,包括在程序里面for循環(huán)還是在sql里面for循環(huán)都不算是批量操作。
只有將ExecutorType設置為BATCH模式才是真正意義上的批量操作。
并且事實證明在sql循環(huán)時設置batch與否其實執(zhí)行時間差別不是很大,幾乎可以忽略不計。
所以其實如果不是特別要求性能。可以直接在sql中使用for循環(huán)即可。
謹慎使用batch,如果需要使用batch,請在需要的函數上面設置batch,不要全局使用。
因為batch也是有副作用的。比如在Insert操作時,在事務沒有提交之前,是沒有辦法獲取到自增的id,此外,對于update、delete無法返回更新、插入條數。這在某型情形下是不符合業(yè)務要求的。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java Spring-IOC容器與Bean管理之基于注解的方式案例詳解
這篇文章主要介紹了Java Spring-IOC容器與Bean管理之基于注解的方式案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08SpringBoot+easypoi實現(xiàn)數據的Excel導出
這篇文章主要為大家詳細介紹了SpringBoot+easypoi實現(xiàn)數據的Excel導出,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05SpringBoot Filter修改返回內容,解決請求卡死200的錯誤
這篇文章主要介紹了SpringBoot Filter修改返回內容,解決請求卡死200的錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07