MyBatis_Mybatis之批量操作
阿新 • • 發佈:2021-02-11
技術標籤:MyBatisMyBatis批量操作資料庫持久化操作
1.引入
MyBatis作為操作資料庫的一個框架,批量操作是我們在開發中經常需要使用到的。下面我們就一起來學習一下如何使用MyBatis進行資料的批量操作。
2.如何使用MyBatis實現批量操作
我們之前學習過使用foreach遍歷,然後通過不斷的新增sql語句拼湊成一條較長的語句轉給我們的資料庫。如下:
<!-- 批量儲存 --> <!--public void addEmps(@Param("emps")List<Employee> emps); --> <!--MySQL下批量儲存:可以foreach遍歷 mysql支援values(),(),()語法--> <insert id="addEmps"> insert into tbl_employee( <include refid="insertColumn"></include> ) values <foreach collection="emps" item="emp" separator=","> (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id}) </foreach> </insert>
但是,我們發現這其實不是真正的實現了批量的操作,因為它其實就是把語句合併成為一條較長的語句,並沒有達到批量的效果。如果我們要使用MyBatis實現資料的批量操作,那麼我們應該使用的是:defaultExecutorType,內容如下:
3.批量操作的實現(新增操作測試)
(1).在對映檔案中新增資料庫新增的sql
<insert id="addUs" useGeneratedKeys="true" keyProperty="id"> insert into tb_us(username,password) values(#{username},#{password}) </insert>
(2).其他的相關操作不變。
(3).編寫批量操作的相關程式碼
public void testBatch() throws IOException{ SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //可以執行批量操作的sqlSession SqlSession openSession = sqlSessionFactory.openSession(ExecutorType.BATCH); long startTime = System.currentTimeMillis(); try{ UserMapper mapper = openSession.getMapper(UserMapper.class); for (int i = 0; i < 10000; i++) { mapper.addUs(new User(UUID.randomUUID().toString().substring(0, 5), "1234")); } openSession.commit(); long endTime = System.currentTimeMillis(); System.out.println("操作時長:"+(endTime - startTime)); }finally{ openSession.close(); } }
(4).測試程式碼:
沒有使用批量操作的時候執行1w條記錄的插入操作使用:它的操作是:(預編譯sql=設定引數=執行)==》10000 12161
使用批量操作:它的操作是:(預編譯sql一次==>設定引數===>10000次===>執行(1次))