oracle+mybatis的批量操作

1 篇文章 0 订阅
1 篇文章 0 订阅

在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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值