程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> mybatis中批量拔出的兩種方法(高效拔出)

mybatis中批量拔出的兩種方法(高效拔出)

編輯:關於JAVA

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中批量拔出的兩種方法(高效拔出),願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved