案例是给一个用户赋予多个权限,多个权限用其对应的主键 id 为参数,组成了 一个id数组,传给springMVC,然后springMVC传给mybatis,然后mybatis批量插入。其实类似的场景还有批量删除多个,也是类似的。

1. 前台页面

        <thead><tr><th>权限选择</th><th>name</th><th>permission</th></tr></thead>
<c:forEach var="priv" items="${list }">
<tr class="odd gradeX">
<td><input type="checkbox" name="priv_id" value="${priv.id}" /></td>
<td><c:out value="${priv.name}"/></td>
<td><c:out value="${priv.permission}"/></td>
</tr>
</c:forEach>

2. jquery获得选中的项的id值:

            //jquery获取复选框值
var priv_ids =[];//定义一个数组
$('input[name="priv_id"]:checked').each(function(){ // 遍历每一个name为priv_id的复选框,其中选中的执行函数
priv_ids.push($.trim($(this).val())); // 将选中的值添加到数组priv_ids中
});
console.log(priv_ids);
var indata = {userId:user_id, privIds:priv_ids};
$.post("/ems/priv/setPrivilege", indata, function(data){
if(data != null && data.result == 'ok'){
console.log(data.msg);
alert(data.msg);
}else{
alert(data.msg);
}
}, 'json');

提交的json格式的数据:var indata = {userId:user_id, privIds:priv_ids};

其中的 priv_ids 是一个有 id 组成的数组。

3. springMVC接收数组参数:

    @RequestMapping(value="/setPrivilege")
@ResponseBody
public void setPrivilege(@RequestParam(value = "privIds[]") Integer[] privIds, Integer userId, PrintWriter writer){
int result = this.privilegeService.setPrivilegeForUser(privIds, userId);
Map<String, String> map = new HashMap<>();
if(result > 0){
map.put("result", "ok");
map.put("msg", "设置成功");
writer.write(JSON.toJSONString(map));
}
}

我们看到使用了:@RequestParam(value = "privIds[]") Integer[] privIds 来获取前台传来的数组参数。

springMVC接收参数时,最好不要使用 int, long等原始类型,而应该使用它们对应的包装类型,不然当传入的参数为空时,会报错,而包装类型可以使用null表示传入的空值。

4. service层的处理,很简单,直接使用map向mybatis传递参数:

@Service("privilegeService")
@Transactional
public class PrivilegeServiceImpl implements PrivilegeService {
@Autowired
private PrivilegeMapper privilegeMapper; @Override
@Transactional(readOnly=true)
public List<Privilege> getAllPrivilege() {
return privilegeMapper.getAllPrivilege();
} @Override
public int setPrivilegeForUser(Integer[] privIds, Integer userId) {
Map<String, Object> map = new HashMap<>();
map.put("privIds", privIds);
map.put("userId", userId);
return this.privilegeMapper.setPrivilegeForUser(map);
}
}

5. 最后看 mybatis 的 xml 中的sql如何写:

  <insert id="setPrivilegeForUser" parameterType="map">
insert into user_privilege(user_id, privilege_id) values
<foreach collection="privIds" index="index" item="item" separator=",">
( #{userId}, #{item} )
</foreach>
</insert>

我们看到使用了 foreach 来循环传递进来的数组 privIds,最后组成的sql语句如下所示:

insert into user_privilege(user_id, privilege_id) values (3, 1),(3,2),(3,3),(3,4) 

user_id 不变,而privilege_id 是数组 privIds 中的循环出来的 id 值。其实就是数据库的批量插入。

6. 批量删除多个的处理

删除时,和前面批量插入处理也是极其类似的,只在最后mybatis中xml中sql的写法有点区别:

  <delete id="deleteByIds" parameterType="java.util.List">
delete from user_privilege where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</delete>

比较批量删除和批量插入,可以看出 foreach 中的 open="(" 和 close=")" 只在循环的开始和结束会加上,而 separator="," 是每循环一次,就加一次逗号

7. 批量插入传入对象List的例子:

<insert id="batchInsertStudent" parameterType="java.util.List">
insert into student (id,name,sex,tel,address) values
<foreach collection="list" item="item" index="index" separator="," >
(#{item.id},#{item.name},#{item.sex},#{item.tel},#{item.address})
</foreach>
</insert>

其实掌握了 批量插入和批量删除,批量更新也是一样的。


springMVC 接收数组参数,mybatis 接收数组参数,mybatis批量插入/批量删除案例的更多相关文章

  1. mybatis + mysql 批量插入、删除、更新

    mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...

  2. mybatis使用foreach进行批量插入和删除操作

    一.批量插入 1.mapper层 int insertBatchRoleUser(@Param("lists") List<RoleUser> lists);//@Pa ...

  3. 【mybatis】mybatis中批量插入 批量更新 batch 进行insert 和 update,或者切割LIst进行批量操作

    ================================================================== 分别展示 mybatis 批量新增  和 批量更新   的操作: ...

  4. mybatis的插入与批量插入的返回ID的原理

    目录 背景 底层调用方法 单个对象插入 列表批量插入 完成 背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次 ...

  5. Mybatis 实现批量插入和批量删除源码实例

    Mybatis 实现批量插入数据和批量删除数据 学习内容: 准备工作 1.数据库新建表 2.新建 Maven 项目和设置编译版本及添加依赖 3.新建 db.properties 4.新建 mybati ...

  6. mybatis+mysql批量插入和批量更新

    一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.x ...

  7. mybatis+mysql批量插入和批量更新、存在及更新

    mybatis+mysql批量插入和批量更新 一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo, ...

  8. SpringMVC高级参数绑定(数组和List)

    本节内容: 参数绑定之数组 将表单的数据绑定到List 复制下上篇博客中的工程,作为今天开发的工程. 一.参数绑定之数组 1. 需求 在商品列表页面选中多个商品,然后删除. 2. 需求分析 功能要求商 ...

  9. SpringMVC注解式开发之接收请求参数

    逐个接收(涉及注解@RequestParam) index.jsp的name必须和后端的名字一致,第一种才可以实现. 以对象形式整合接收 域属性参数的接收 数组或集合参数的接收 restfull风格传 ...

随机推荐

  1. sprint3(第十天)

    因为近期准备四六级考试还有准备期末的作业,任务比较多,所以进度落下了很多,没有完成预期的计划. 燃尽图

  2. AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora

    Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...

  3. Winform开发框架之简易工作流设计

    一讲到工作流,很多人第一反应就是这个东西很深奥,有时候又觉得离我们较为遥远,确实完善的工作流设计很多方面,而正是由于需要兼顾很多方面,一般通用的工作流都难做到尽善尽美.微软也提供了几个版本的WF框架支 ...

  4. private、 protected、 public、 internal 修饰符

    private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 在同一 ...

  5. jQquery.validate自定义规则的使用案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Python Import 详解

    http://blog.csdn.net/appleheshuang/article/details/7602499 一 module通常模块为一个文件,直接使用import来导入就好了.可以作为mo ...

  7. 在Eclipse中配置Tomcat时,出现Cannot create a server using the selected type错误

    在eclipse中配置Tomcat时,出现Cannot create a server using the selected type错误 原因:Tomcat被删除或者是重新安装,并且安装目录改变了. ...

  8. 泛函编程(16)-泛函状态-Functional State

    初接触泛函状态觉着很不习惯.主要是在使用State数据类型时很难理解其中的原理,特别是泛函状态变迁机制(state transition mechanism):怎么状态就起了变化,实在难以跟踪.我想这 ...

  9. C语言范例学习03-中

    栈和队列 这两者都是重要的数据结构,都是线性结构.它们在日后的软件开发中有着重大作用.后面会有实例讲解. 两者区别和联系,其实总结起来就一句.栈,后进先出:队列,先进先出. 可以将栈与队列的存储空间比 ...

  10. (旧)子数涵数·C语言——条件语句

    首先,我们讲一下理论知识,在编程中有三种结构,分别是顺序结构.条件结构.循环结构,如果用流程图来表示的话就是: 那么在C语言中,如何灵活运用这三种结构呢?这就需要用到控制语句了. 而条件语句便是控制语 ...