mybatis中批量拔出的兩種方法(高效拔出)。本站提示廣大學習愛好者:(mybatis中批量拔出的兩種方法(高效拔出))文章只能為提供參考,不一定能成為您想要的結果。以下是mybatis中批量拔出的兩種方法(高效拔出)正文
MyBatis簡介
MyBatis是一個支撐通俗SQL查詢,存儲進程和高等映照的優良耐久層框架。MyBatis清除了簡直一切的JDBC代碼和參數的手工設置和對成果集的檢索封裝。MyBatis可使用簡略的XML或注解用於設置裝備擺設和原始映照,將接口和Java的POJO(Plain Old Java Objects,通俗的Java對象)映照成數據庫中的記載。
1、mybiats foreach標簽
foreach的重要用在構建in前提中,它可以在SQL語句中停止迭代一個聚集。foreach元素的屬性重要有 item,index,collection,open,separator,close。item表現聚集中每個元素停止迭代時的別號,index指 定一個名字,用於表現在迭代進程中,每次迭代到的地位,open表現該語句以甚麼開端,separator表現在每次停止迭代之間以甚麼符號作為分隔 符,close表現以甚麼停止,在應用foreach的時刻最症結的也是最輕易失足的就是collection屬性,該屬性是必需指定的,然則在分歧情形 下,該屬性的值是紛歧樣的,重要有一下3種情形:
假如傳入的是單參數且參數類型是一個List的時刻,collection屬性值為list
假如傳入的是單參數且參數類型是一個array數組的時刻,collection的屬性值為array
假如傳入的參數是多個的時刻,我們就須要把它們封裝成一個Map了
詳細用法以下:
<insert id="insertBatch" parameterType="List"> INSERT INTO TStudent(name,age) <foreach collection="list" item="item" index="index" open="("close=")"separator="union all"> SELECT #{item.name} as a, #{item.age} as b FROM DUAL </foreach> </insert>
2、mybatis ExecutorType.BATCH
Mybatis內置的ExecutorType有3種,默許的是simple,該形式下它為每一個語句的履行創立一個新的預處置語句,單條提交sql;而batch形式反復應用曾經預處置的語句,而且批量履行一切更新語句,明顯batch機能將更優; 但batch形式也有本身的成績,好比在Insert操作時,在事務沒有提交之前,是沒有方法獲得到自增的id,這在某型情況下是不相符營業請求的
詳細用法以下:
*方法一 spring+mybatis 的
//獲得sqlsession //從spring注入原本的sqlSessionTemplate @Autowired private SqlSessionTemplate sqlSessionTemplate; // 新獲得一個形式為BATCH,主動提交為false的session // 假如主動提交設置為true,將沒法掌握提交的條數,改成最初同一提交,能夠招致內存溢出 SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false); //經由過程新的session獲得mapper fooMapper = session.getMapper(FooMapper.class); int size = 10000; try{ for(int i = 0; i < size; i++) { Foo foo = new Foo(); foo.setName(String.valueOf(System.currentTimeMillis())); fooMapper.insert(foo); if(i % 1000 == 0 || i == size - 1) { //手動每1000個一提交,提交後沒法回滾 session.commit(); //清算緩存,避免溢出 session.clearCache(); } } } catch (Exception e) { //沒有提交的數據可以回滾 session.rollback(); } finally{ session.close(); } spring+mybatis
辦法二:
聯合通用mapper sql別號最好是包名+類名
public void insertBatch(Map<String,Object> paramMap, List<User> list) throws Exception { // 新獲得一個形式為BATCH,主動提交為false的session // 假如主動提交設置為true,將沒法掌握提交的條數,改成最初同一提交,能夠招致內存溢出 SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); try { if(null != list || list.size()>0){ int lsize=list.size(); for (int i = 0, n=list.size(); i < n; i++) { User user= list.get(i); user.setIndate((String)paramMap.get("indate")); user.setDatadate((String)paramMap.get("dataDate"));//數據歸屬時光 //session.insert("com.xx.mapper.UserMapper.insert",user); //session.update("com.xx.mapper.UserMapper.updateByPrimaryKeySelective",_entity); session.insert(“包名+類名", user); if ((i>0 && i % 1000 == 0) || i == lsize - 1) { // 手動每1000個一提交,提交後沒法回滾 session.commit(); // 清算緩存,避免溢出 session.clearCache(); } } } } catch (Exception e) { // 沒有提交的數據可以回滾 session.rollback(); e.printStackTrace(); } finally { session.close(); } }
以上所述是小編給年夜家引見的mybatis中批量拔出的兩種方法(高效拔出),願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!