struts2 批量提交 多条插入

这个是在前两天做项目的时候 , 遇到的问题 。用strust2+ibatis+mysql做的。直接用的action 中一个很普通的循环插入。
后来经部长提示,如果数据很多的话,那么对于库的压力,工程的压力,要改进插入的方式。

jsp页面中,可能每一条数据都是一组bean。在页面中存在多个bean组成的一个form表单,然后一次性的把你添的所有的数据都插入到你的数据库中去。首先想到的就是能不能用一个集合去做?答案是当然可以的。要不也不能在这里说了。有人用的map 做的。在这里呢 ,我用的是list 给大家演示吧,也许很多朋友看了将来也能够遇到吧。我的原来的bean中包含了很多个字段在这我就简化一下。

javaBean:

我们在做的时候,要求以dto的形式提交数据(其实用什么都随便的)

public class PersonCareerDto {

private String name; //姓名
private String personId; //身份证

....//省略get , set

}



PersonCareerAction:

public class PersonCareerRegisterAction extends ActionSupport{

private PersonCareerDto dto;
private List<PersonCareerFormBean> careerList; //用于去接受页面的数据,对应的封装到集合中
private PersonCareerRegistDao dao;

public PersonCareerRegisterAction() {
dao = new PersonCareerRegistDao();
}

@Override
public String execute() throws Exception {
dto = new PersonCareerDto();
List<PersonCareerDto> dtoList;

//这里是身份证为空的
if(!"".equals(dto.getPersonId1()) || !"".equals(dto.getPersonId2())){
if(careerList.size()!=0){
dao.personCareerRegist(dtoList);
}
}

return SUCCESS;
}

public List<PersonCareerFormBean> getCareerList() {
return careerList;
}

public void setCareerList(List<PersonCareerFormBean> careerList) {
this.careerList = careerList;
}

}



PersonCareerRegistDao :

public class PersonCareerRegistDao {

private SqlMapClient sqlMap;
private List<PersonCareerDto> careerList;

public PersonCareerRegistDao(){
sqlMap= IbizIntraManager.getSqlMap();
}

public void personCareerRegist(List<PersonCareerDto> dtoList){
try {
sqlMap.insert("personCareerRegist",dtoList);
} catch (Exception e) {
e.printStackTrace();
}
}



最主要的地方就在xml 和 jsp 中了。

sqlMap.xml:

<sqlMap>
<typeAlias alias="careerDto" type="com.ibizware.ibizintra.person.regist.dto.PersonCareerDto"/>

<insert id="personCareerRegist" parameterClass="java.util.List">
insert into person_career (person_id, name)
values

<!--

这个地方是个关键的地方。它是ibatis中带有的一个迭代标签,很方便的用于你要处理多个元素的时候用的。最终我写的这个sql语句正成的时候是:

insert into (person_id,name) person_career values (personId,name),(personId,name)...

生成一个完成的sql语句,一次执行完插入所有的数据。这个是mysql自己本身的一个插入多条的语法。

下面这个迭代,有几个属性,conjunction 是你要以什么作为分割,还有open 是以什么开始,close属性是以什么结束。property 是你要迭代的变量。这里我只写了一个,是有原因的。我开始的时候也写了property 但是找不到所要的list中的元素也就是bean,后来我把它删掉了。就好使了。

-->
<iterate conjunction=",">
(#careerList[].personId#,#careerList[].name#
</iterate>
</insert>

</sqlMap>



jsp:

这个就好说了,把对应的属性元素写好就Ok了。但有一点,我下面写的,它们都会自动去匹配到action中声明的list集合中,封装成一个一个对应的bean.

<s:iterator value="careerDtoList" status="stat">
<tr>
<td>

<input name="careerList[<s:property value={#stat.index}'/>].personId" type="text" id="projectPerform" size="17" maxlength="30"/></td>
<td align="left>

<input name="careerList[<s:property value='%{#stat.index}'/>].name" type="text" id="partPeriod2" size="4" maxlength="7" ></td>
</tr>
</s:iterator>



这样就搞定了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值