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

1. 前台页面

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

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

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

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

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

3. springMVC接收数组参数:

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

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

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

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

  1. @Service("privilegeService")
  2. @Transactional
  3. public class PrivilegeServiceImpl implements PrivilegeService {
  4. @Autowired
  5. private PrivilegeMapper privilegeMapper;
  6.  
  7. @Override
  8. @Transactional(readOnly=true)
  9. public List<Privilege> getAllPrivilege() {
  10. return privilegeMapper.getAllPrivilege();
  11. }
  12.  
  13. @Override
  14. public int setPrivilegeForUser(Integer[] privIds, Integer userId) {
  15. Map<String, Object> map = new HashMap<>();
  16. map.put("privIds", privIds);
  17. map.put("userId", userId);
  18. return this.privilegeMapper.setPrivilegeForUser(map);
  19. }
  20. }

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

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

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

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

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

6. 批量删除多个的处理

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

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

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

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

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

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

  1.  

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. Node之pm2

    最近在项目中使用了Node,在程序部署的时候直接使用命令:node app.js ,这样我们的程序就可以host起来了,但是只要dos窗口关掉之后node就关闭了,这使得我们很不方便,于是乎发现了pm ...

  2. Qt之QAbstractItemView视图项拖拽(二)

    一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...

  3. [Architect] Abp 框架原理解析(5) UnitOfWork

    本节目录 介绍 分析Abp源码 实现UOW 介绍 UOW(全称UnitOfWork)是指工作单元. 在Abp中,工作单元对于仓储和应用服务方法默认开启.并在一次请求中,共享同一个工作单元. 同时在Ab ...

  4. Linux - Ubuntu下JDK配置

    系统版本: ubuntu 14.04 x64JDK版本: jdk-8u60-linux-x64 1.查看系统位数,输入以下命令即可 getconf LONG_BIT 2.下载对应的JDK文件,我这里下 ...

  5. OnMeasureItem和OnDrawItem的区别和联系

    我们在做程序设计时界面与功能,那个更加吸引用户的兴趣呢?这是一个很难回答的问题.拥有美丽的外观,软件就成功了一半.界面由控件.工具栏.菜单.窗体等元素组成,对他们进行美化就能得到一个美丽的界面. 目前 ...

  6. Winform开发框架之客户关系管理系统(CRM)的开发总结系列3-客户分类和配置管理实现

    我在本系列随笔的开始,介绍了CRM系统一个重要的客户分类的展示界面,其中包含了从字典中加载分类.从已有数据中加载分类.以及分组列表中加载分类等方式的实现,以及可以动态对这些节点进行配置,实现客户分类的 ...

  7. 实现GridView翻页并且实现CheckBox选中功能的保持

    在GridView与数据库进行绑定后,由得到的数据记录可能有许多条,以至一个页面无法容纳,这时需要进行多页显. 要实现分页显现,只要使用分页类 "PagedDataSource" ...

  8. Spring RMI Example

    一: 提供服务的远程一端 1-1. applicationContext.xml <?xml version="1.0" encoding="UTF-8" ...

  9. Spark集群 + Akka + Kafka + Scala 开发(4) : 开发一个Kafka + Spark的应用

    前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境中,我们已经部署好了一个Spark的开发环境. 在Spark集群 + Akka + Kafka + S ...

  10. SFTP和FTS协议的区别

    都是为FTP连接加密,协议非常相似.一个是借助SSL协议加密,一个时借助SSH协议加密.SSL是为HTTP/SMTP等加密设计的:SSH是为TELNET/FTP等加密.建立传输通道而设计的.其实SSH ...