在mybatis中进行批量操作需要调用专门执行批量操作的sqlsession,而我们一般会使用spring提供的sqlsessionTemplate或者自己将常用的操作封装成一个模板,在这个过程中需要在sqlsessionTemplate的构造方法中传入sqlsessionFactory的参数,并提供一个getSqlSessionFactory()方法
我们通过这个getSqlSessionFactory()方法来创建适合批量操作的sqlsession
在原先的项目中是封装了一个MybatisBasicDAO的封装类,并将sqlsessionTemplate作为一个静态内部类封装进basicdao中,并在sqlsessionTemplate传入sqlSessionFactory
public static class SqlSessionTemplate
{
SqlSessionFactory sqlSessionFactory;
/**
* 构建SqlSessionTemplate
* @param sqlSessionFactory
*/
public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory = sqlSessionFactory;
}
/**
* 获取sqlSessionFactory
* @return
*/
public SqlSessionFactory getSqlSessionFactory(){
return this.sqlSessionFactory;
}
/**
* 执行操作的模版方法
* @param action
* @return
*/
public Object execute(SqlSessionCallback action){
SqlSession session = null;
try{
session = sqlSessionFactory.openSession();
Object result = action.doInSession(session);
return result;
}
finally{
if (session != null)
session.close();
}
}
可以看到实际操作中,还是使用sqlSessionFactory.openSession()来进行操作
而在sqlSessionFactory中重载了多种openSession的方法,如下:
参数意义如下:
autoCommit:事务操作是否自动给提交
transactionIsolationLevel:事物的隔离级别
executorType:处理类型,其中这里的处理类型分为三类:simple,batch和reuse
connection:数据库连接
这里我们选择倒数第二种
SqlSession sql=getSqlSessionTemplate().getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
- 这是我们自己创建的链接,最后一定要记得关闭资源
public int insertLocalstaffcode(List<String> localStaffcodeList){
SqlSession sql=getSqlSessionTemplate().getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
try{
String insertStatement=getIbatisMapperNamespace() + ".insertLocalstaffcode";
IbatisSql ibatisSql=this.getIbatisSql(insertStatement, localStaffcodeList);
log.info(ibatisSql.getSql());
sql.insert(insertStatement, localStaffcodeList);
sql.commit();
return 1;
}catch(Exception e){
sql.rollback();
return -1;
}finally{
sql.close();
}
}
- 在oracle中配置sql语句
<insert id="insertData" parameterType="java.util.List">
INSERT INTO SM_FLAG_PARTY
(ID,LOCALSTAFFCODE,DEPT,TYPE,BRANCH_NAME,JOB_NAME,JOB_START_TIME,JOB_END_TIME,KEY_POINT_EVENT)
<foreach collection="list" item="item" index="index" separator="UNION ALL" >
select
#{item.id,jdbcType=NUMERIC}, #{item.localstaffcode,jdbcType=VARCHAR},
#{item.dept,jdbcType=DATE}, #{item.type,jdbcType=VARCHAR},
#{item.branchName,jdbcType=VARCHAR}, #{item.jobName,jdbcType=VARCHAR},
#{item.jobStartTime,jdbcType=DATE}, #{item.jobEndTime,jdbcType=DATE},
#{item.keyPointEvent,jdbcType=VARCHAR}
from dual
</foreach>
</insert>
注意与mysql中的语句有些区别,没有values,separator也有所不同,mysql如下:
<insert id="insertData" parameterType="java.util.List">
INSERT INTO SM_FLAG_PARTY
(ID,LOCALSTAFFCODE,DEPT,TYPE,BRANCH_NAME,JOB_NAME,JOB_START_TIME,JOB_END_TIME,KEY_POINT_EVENT)
values
<foreach collection="list" item="item" index="index" separator="," >
#{item.id,jdbcType=NUMERIC}, #{item.localstaffcode,jdbcType=VARCHAR},
#{item.dept,jdbcType=DATE}, #{item.type,jdbcType=VARCHAR},
#{item.branchName,jdbcType=VARCHAR}, #{item.jobName,jdbcType=VARCHAR},
#{item.jobStartTime,jdbcType=DATE}, #{item.jobEndTime,jdbcType=DATE},
#{item.keyPointEvent,jdbcType=VARCHAR}
</foreach>
</insert>