`

ibatis 批量提交sql

 
阅读更多

我项目的持久层用的是ibatis:

 

我项目接口被人调用后返回 jsonArray字符串,然后换成List<Object>对象,insert是,循环List<Object>对象批量插入,代码图如下:

 

Action层:

@RequestMapping(value = "/test.htm", method = RequestMethod.POST)
    public String init(HttpServletRequest request ) throws IOException {

        //接收接口返回数据
        Map<String, String> map = new HashMap<String, String>();
        Enumeration<?> fields = request.getParameterNames();

        while(fields.hasMoreElements())
        {
            String field = (String) fields.nextElement();
            String[] values = request.getParameterValues(field);
            if (values.length > 1)
                map.put(field, values.toString());
            else
map.put(field, values[0]);
        }
        System.out.println(map.get("jsonArray"));


        //自定义测试数据
//        String arrayStr ="[{\"amount\":\"9.83\",\"fundCategory\":\"A\",\"postStaus\":\"I\",\"fundChannelCode\":\"WEIXINPAY11601\",\"instOrder\":\"FI116011001082400080288\",\"happenDate\":\"20170824\",\"remarks\":\"20170824扣除入款手续费9.83元\",\"creater\":\"Arvin\",\"createTime\":\"20170907\",\"auditor\":\"\",\"auditorTime\":\"\",\"deleteFlag\":\"N\"},{\"amount\":\"15.77\",\"fundCategory\":\"A\",\"postStaus\":\"I\",\"fundChannelCode\":\"WEIXINPAY11601\",\"instOrder\":\"FI116011001082400080301\",\"happenDate\":\"20170824\",\"remarks\":\"20170824扣除入款手续费15.77元\",\"creater\":\"Arvin\",\"createTime\":\"20170907\",\"auditor\":\"\",\"auditorTime\":\"\",\"deleteFlag\":\"N\"}]";
if(map.get("jsonArray")!=null && map.get("jsonArray").length()>0){
            String arrayStr = map.get("jsonArray");
            logger.info("接口返回jsonArray:"+arrayStr);
            List<PostAccountVO> postAccountVOList = new ArrayList<PostAccountVO>();

            List<Map<String,String>> listObjectSec = JSONArray.parseObject(arrayStr,List.class);
            Map<String,String> mapList = new HashMap<String, String>();
            for(int i=0;i<listObjectSec.size();i++){
                mapList = listObjectSec.get(i);
                JSONObject jsonObject = JSONObject.fromObject(mapList);
                PostAccountVO postAccountVO=(PostAccountVO)JSONObject.toBean(jsonObject, PostAccountVO.class);
                postAccountVOList.add(postAccountVO);
            }
            System.out.println( postAccountVOList.size());

            //接收的数据转list对象后,存入数据库
            GlideSyncResult result = postAccountFacade.getBankHandlingCharge(postAccountVOList);

        }else{
            System.out.println("接口返回为空!");
            logger.info("接口返回为空!");
        }

        return "";
    }

 

service层:

public GlideSyncResult getBankHandlingCharge(List<PostAccountVO> vo);

 

service  impl实现层:

我的情况是:service层实体类都为VO,dao层实体类为DO,所以想要调用dao层方法,想要把对象转为dao层对象

(VO和DO实体类是一样的,但是这个项目都是按照这个格式走的,我也分别建了VO和DO两个实体类,你们应该也许建一个实体类就好了,这样不用转换了)

 

@Override
public GlideSyncResult getBankHandlingCharge(List<PostAccountVO> vo) {



    List<PostAccountInfoDO> infoDOList = new ArrayList<PostAccountInfoDO>();
    int status=0;

    if(vo!=null && vo.size()>0){

            for(int i=0;i<vo.size();i++){
                PostAccountInfoDO infoDO = new PostAccountInfoDO();
                    infoDO.setAccountSeqNo(postAccountInfoDAO.getAccountNo());
                    infoDO.setAmount(vo.get(i).getAmount());
                    infoDO.setFundCategory(vo.get(i).getFundCategory());
                    infoDO.setPostStaus(vo.get(i).getPostStaus());
                    infoDO.setFundChannelCode(vo.get(i).getFundChannelCode());
                    infoDO.setHappenDate(vo.get(i).getHappenDate());
                    infoDO.setRemarks(vo.get(i).getRemarks());
                    infoDO.setCreater(vo.get(i).getCreater());
                    infoDO.setCreateTime(vo.get(i).getCreateTime());
                    infoDO.setAuditor(vo.get(i).getCreater());
                    infoDO.setAuditorTime(vo.get(i).getCreateTime());
                    infoDO.setDeleteFlag(vo.get(i).getDeleteFlag());
                    infoDO.setInstOrder(vo.get(i).getInstOrder());

                    infoDOList.add(infoDO);
            }

        status = postAccountInfoDAO.insert(infoDOList);
    }

    if (status> 0) {
        return new GlideSyncResult(GlideSyncResultCode.SUCCESS);
    } else {
        return new GlideSyncResult(GlideSyncResultCode.FAILED);
    }
}

 

dao层:

public int insert(List<PostAccountInfoDO> infoDOList ) throws DataAccessException;

 

dao  impl实现层:

@Override
public int insert(List<PostAccountInfoDO> infoDOList ) throws DataAccessException {
    if(infoDOList==null){
        throw new IllegalArgumentException("Can't insert a null data object into db.");
    }
    Integer nums =  (Integer)getSqlMapClientTemplate().insert("MS-POST-ACCOUNT-INFO-INSERT", infoDOList);

    if(nums==null){
        return 1;
    }

    return 0;
}

 

mapper.xml:

<insert id="MS-POST-ACCOUNT-INFO-INSERT" parameterClass="java.util.List">
      insert all
      <iterate  conjunction="" >
         <![CDATA[
         into TB_POST_ACCOUNT_INFO
         (ACCOUNT_SEQ_NO,AMOUNT,FUND_CATEGORY,POST_STAUS,FUND_CHANNEL_CODE,HAPPEN_DATE,REMARKS,CREATER,CREATE_TIME,AUDITOR,AUDITOR_TIME,DELETE_FLAG,INST_ORDER)
         values
            (#infoDOList[].accountSeqNo#,#infoDOList[].amount#,#infoDOList[].fundCategory#,#infoDOList[].postStaus#,
            #infoDOList[].fundChannelCode#,#infoDOList[].happenDate#,#infoDOList[].remarks#,#infoDOList[].creater#,
#infoDOList[].createTime#,#infoDOList[].auditor#,#infoDOList[].auditorTime#,#infoDOList[].deleteFlag#,
#infoDOList[].instOrder#)
        ]]>
      </iterate>
      select 1 from dual
   </insert>

 

注意 :

如果添加数据的时候,如果有自动生成参数,譬如:

<select id="ACCOUNT-INFO-NO" resultClass="String">
   <![CDATA[
       select seq_post_account_info.nextval from dual
   ]]>
</select>

 

建议,单独写sql查询,查出之后往对象里边塞值,如下图:



 

 

方法比较笨。。。

并且,这个方法批量提交数量要小于 一千条(size() < 1000)

 

如果发现有更好的方法请提出来,我也学习一下。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 19.5 KB
分享到:
评论

相关推荐

    ibatis应对批量update

    #### ibatis批量Update解决方案 ibatis提供了一套完善的批量更新机制,可以有效地解决上述问题。下面详细介绍如何利用ibatis实现高效的批量更新: 1. **准备工作**: - 首先确保你的ibatis版本支持批量更新功能。...

    ibatis批量存储

    本文将深入探讨“ibatis批量存储”这一主题,基于给定的文件名,我们将依次解析Ibatis中的iterate标签、批处理、foreach标签以及如何在Ibatis中使用HashMap。 1. Iterate标签详解及应用: Ibatis的iterate标签主要...

    ibatis的批量插入DAO实例

    通过以上步骤,我们就完成了Ibatis批量插入的DAO实例。在实际项目中,根据业务需求可能需要对SQL语句进行优化,如开启或关闭数据库的自动提交,或者调整批处理的大小以平衡性能和内存消耗。此外,Ibatis还支持使用`...

    ibatis批量处理

    ### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。iBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...

    基于mybatis batch实现批量提交大量数据

    "基于MyBatis批量提交大量数据的实现" MyBatis批量提交大量数据是...需要注意在xml文件中配置多条参数同时插入,使用SqlSessionFactory和SqlSession来执行批量提交操作,并分段处理长sql语句,以免超出数据库的限制。

    ibatis api,ibatis文档,ibatis说明文档

    Ibatis提供了两种执行器:SimpleExecutor和BatchExecutor,分别对应单条SQL执行和批量SQL执行。 5. ParameterMap和ParameterHandler:它们负责参数的设置和处理,ParameterMap代表了SQL参数的映射关系,而...

    IBatis.NET开发文档

    - 批量操作:如何利用iBATIS进行批量插入、更新或删除。 - 动态SQL的最佳实践:分享编写高效动态SQL的技巧和注意事项。 通过深入学习这些文档,开发者可以熟练掌握iBATIS.NET,实现高效、灵活的数据访问,同时...

    ibatis 开发指南 2004

    8. **事务管理**:讨论iBatis如何进行事务控制,包括手动和自动提交,以及事务隔离级别。 9. **插件机制**:介绍iBatis的插件功能,如何自定义插件拦截SQL执行过程,实现如日志记录、性能分析等功能。 10. **缓存...

    ibatis jar包

    4. 执行器(Executor):Ibatis中的执行器是SQL语句执行的入口,它根据配置决定是执行简单查询还是缓存查询,或者是批量操作。 5. 缓存机制:Ibatis支持本地缓存和二级缓存,可以提高数据读取速度,减少对数据库的...

    ibatis-2.3.

    10. **Batch Operations**: iBATIS 支持批量操作,如插入、更新和删除,可以提高数据处理效率。 从描述 "ibatis-2.3.ibatis-2.3.ibatis-2.3" 看,似乎是在强调这个版本,但并没有提供额外的信息。标签 "ibat" 显然...

    ibatis 使用手册

    5. **事务管理**: iBatis提供了事务控制功能,开发者可以自定义事务的提交和回滚。 **iBatis开发指南** 开发指南会深入讲解如何初始化iBatis环境,包括设置配置文件、创建SqlMap文件、设计Mapper接口以及如何在...

    ibatis-2 源代码

    iBatis支持手动和自动事务管理,开发者可以通过TransactionManager来控制事务的提交和回滚。同时,它也支持Spring的声明式事务管理。 7. **插件支持** iBatis提供插件机制,通过拦截器(Interceptor)可以在SQL...

    Ibatis.net学习和实例~

    4. **事务管理**:Ibatis.net支持事务控制,可以通过编程方式或配置文件来管理事务的开始、提交和回滚。 5. **动态SQL**:Ibatis.net允许你在SQL映射文件中编写动态SQL,根据条件改变查询的结构,这在处理复杂的...

    ibatis源码

    SimpleExecutor每次执行一个SQL语句,而BatchExecutor则将多个SQL语句批量提交,提高了效率。 4. **Statement处理**:Ibatis提供了两种Statement处理方式:PreparedStatement(预编译SQL)和Statement(普通SQL)。...

    ibatis源代码

    在Ibatis中,SQL的执行、结果集的映射以及参数的绑定都由框架来处理,降低了开发人员的工作负担。 Ibatis 的核心组件包括: 1. **SqlSessionFactory**: SqlSessionFactory 是 Ibatis 的核心工厂类,它负责创建...

    iBatis操作

    此方法实现了批量插入的功能,通过`SqlMapClientTemplate`进行操作,并且每500条数据执行一次批量提交,以减少网络传输次数,提高性能。 #### 五、性能优化 批量操作相比于单条数据操作有显著的性能优势。根据实际...

    ibatis学习和实践

    4. Executor:执行器,负责执行SQL,有简单执行器、缓存执行器和批量执行器三种类型。 5. MappedStatement:封装了SQL语句及其执行方法的配置信息。 6. ParameterMap:参数映射,处理传入参数。 7. ResultMap:结果...

Global site tag (gtag.js) - Google Analytics