需求分析:Dept是一个自关联表,子部门和父部门是同一张表。删除一个部门的信息时,首先确定它的有没有子部门,如果有子部门就先将其子部门都删除然后再删除父部门。这里就用到了递归删除的方案:
js页面:
<div class="eXtremeTable" >
<table id="ec_table" class="tableRegion" width="98%" >
<thead>
<tr>
<td class="tableHeader"><input type="checkbox" name="selid" οnclick="checkAll('id',this)"></td>
<td class="tableHeader">序号</td>
<td class="tableHeader">编号</td>
<td class="tableHeader">上级</td>
<td class="tableHeader">名称</td>
</tr>
</thead>
<tbody class="tableBody" >
<!-- links是在page工具类中分页进行了封装的 -->
${links }
<!-- results是在page工具类中List<T>进行了封装的 -->
<c:forEach items="${results }" var="dept" varStatus="st">
<tr class="odd" οnmοuseοver="this.className='highlight'" οnmοuseοut="this.className='odd'" align="left">
<td><input type="checkbox" name="id" value="${dept.id }"/></td>
<td>${st.count }</td>
<td>${dept.id }</td>
<td>${dept.parent.deptName }</td>
<td><a href="deptAction_toview?id=${dept.id }">${dept.deptName }</a></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
这里用到了批量删除:
web层:即action中
public String delete() throws Exception {
//1.得到用户所选中的id数组
String ids[] = model.getId().split(", ");
//2.调用业务方法,实现删除操作
deptService.delete(Dept.class, ids);
//3.跳页面
return "alist";
}
service层:
public void deleteById(Class<Dept> entityClass, Serializable id) {
//1.加载出当前这个部门下的所有子部门
List<Dept> deptList = baseDao.find("from Dept where parent.id=?", Dept.class, new Serializable[]{id});
//2.遍历
if(deptList!=null && deptList.size()>0){
for(Dept dept :deptList){
deleteById(Dept.class,dept.getId());// 递归删除当前这个子部门下面的子部门
}
}
baseDao.deleteById(entityClass, id);
}
public void delete(Class<Dept> entityClass, Serializable[] ids) {
//baseDao.delete(entityClass, ids);
for(Serializable id :ids){
deleteById(Dept.class,id);//调用上面的删除一条记录的方法
}
}
dao层:
//单条删除,按id
public <T> void deleteById(Class<T> entityClass, Serializable id);
//批量删除
public <T> void delete(Class<T> entityClass, Serializable[] ids);
将递归加到service而不加到dao层的原因是方便事务回滚。