我项目的持久层用的是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)
如果发现有更好的方法请提出来,我也学习一下。
相关推荐
#### ibatis批量Update解决方案 ibatis提供了一套完善的批量更新机制,可以有效地解决上述问题。下面详细介绍如何利用ibatis实现高效的批量更新: 1. **准备工作**: - 首先确保你的ibatis版本支持批量更新功能。...
本文将深入探讨“ibatis批量存储”这一主题,基于给定的文件名,我们将依次解析Ibatis中的iterate标签、批处理、foreach标签以及如何在Ibatis中使用HashMap。 1. Iterate标签详解及应用: Ibatis的iterate标签主要...
通过以上步骤,我们就完成了Ibatis批量插入的DAO实例。在实际项目中,根据业务需求可能需要对SQL语句进行优化,如开启或关闭数据库的自动提交,或者调整批处理的大小以平衡性能和内存消耗。此外,Ibatis还支持使用`...
### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。iBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...
"基于MyBatis批量提交大量数据的实现" MyBatis批量提交大量数据是...需要注意在xml文件中配置多条参数同时插入,使用SqlSessionFactory和SqlSession来执行批量提交操作,并分段处理长sql语句,以免超出数据库的限制。
Ibatis提供了两种执行器:SimpleExecutor和BatchExecutor,分别对应单条SQL执行和批量SQL执行。 5. ParameterMap和ParameterHandler:它们负责参数的设置和处理,ParameterMap代表了SQL参数的映射关系,而...
- 批量操作:如何利用iBATIS进行批量插入、更新或删除。 - 动态SQL的最佳实践:分享编写高效动态SQL的技巧和注意事项。 通过深入学习这些文档,开发者可以熟练掌握iBATIS.NET,实现高效、灵活的数据访问,同时...
8. **事务管理**:讨论iBatis如何进行事务控制,包括手动和自动提交,以及事务隔离级别。 9. **插件机制**:介绍iBatis的插件功能,如何自定义插件拦截SQL执行过程,实现如日志记录、性能分析等功能。 10. **缓存...
4. 执行器(Executor):Ibatis中的执行器是SQL语句执行的入口,它根据配置决定是执行简单查询还是缓存查询,或者是批量操作。 5. 缓存机制:Ibatis支持本地缓存和二级缓存,可以提高数据读取速度,减少对数据库的...
10. **Batch Operations**: iBATIS 支持批量操作,如插入、更新和删除,可以提高数据处理效率。 从描述 "ibatis-2.3.ibatis-2.3.ibatis-2.3" 看,似乎是在强调这个版本,但并没有提供额外的信息。标签 "ibat" 显然...
5. **事务管理**: iBatis提供了事务控制功能,开发者可以自定义事务的提交和回滚。 **iBatis开发指南** 开发指南会深入讲解如何初始化iBatis环境,包括设置配置文件、创建SqlMap文件、设计Mapper接口以及如何在...
iBatis支持手动和自动事务管理,开发者可以通过TransactionManager来控制事务的提交和回滚。同时,它也支持Spring的声明式事务管理。 7. **插件支持** iBatis提供插件机制,通过拦截器(Interceptor)可以在SQL...
4. **事务管理**:Ibatis.net支持事务控制,可以通过编程方式或配置文件来管理事务的开始、提交和回滚。 5. **动态SQL**:Ibatis.net允许你在SQL映射文件中编写动态SQL,根据条件改变查询的结构,这在处理复杂的...
SimpleExecutor每次执行一个SQL语句,而BatchExecutor则将多个SQL语句批量提交,提高了效率。 4. **Statement处理**:Ibatis提供了两种Statement处理方式:PreparedStatement(预编译SQL)和Statement(普通SQL)。...
在Ibatis中,SQL的执行、结果集的映射以及参数的绑定都由框架来处理,降低了开发人员的工作负担。 Ibatis 的核心组件包括: 1. **SqlSessionFactory**: SqlSessionFactory 是 Ibatis 的核心工厂类,它负责创建...
此方法实现了批量插入的功能,通过`SqlMapClientTemplate`进行操作,并且每500条数据执行一次批量提交,以减少网络传输次数,提高性能。 #### 五、性能优化 批量操作相比于单条数据操作有显著的性能优势。根据实际...
4. Executor:执行器,负责执行SQL,有简单执行器、缓存执行器和批量执行器三种类型。 5. MappedStatement:封装了SQL语句及其执行方法的配置信息。 6. ParameterMap:参数映射,处理传入参数。 7. ResultMap:结果...