Db.batch 问题

public void allowAllNomalAskInfo(){
   List<AskForLeave> list = new ArrayList<>();
   //得到请假信息的Id
   String id = getPara("ids");
   String[] ids = id.split(",");
   for (int i = 0; i <ids.length ; i++) {
      AskForLeave asc = new AskForLeave();
      asc.setId(Integer.valueOf(ids[i]));
      list.add(asc);
   }
   //得到老师的openid
   String openid = getPara("openid");
   //调用service层方法
   boolean flag = phoneGetAskInfoService.allowAllNormalAsk(openid, list);
   //返回审批是否成功
   if (flag){
      renderSuccess("1");
   }else {
      renderError("0");
   }
}
public boolean allowAllNormalAsk(String allowopenid, List<AskForLeave> IdList){

   boolean succeed = Db.tx(new IAtom() {
      public boolean run() throws SQLException {
         String sql = "update sc_askforleave set status='已审批' ,allowopenid='"+allowopenid+"' where id =?";
         int[] result = Db.batch(sql,"id",IdList,100);
         for (int i = 0; i < result.length; i++) {
            if(result[i] <= 0){
               System.out.println("没更新到");
               return false;
            }
         }
         return true;
      }
   });
   return succeed;
}
第一个controller层,得到一个字符串1,2,5  我把它切割成数组,然后for循环存入请假类中(请假类中有id这个字段).请假类存入list中,调用service方法,按照文档和我搜索的其它的反馈的例子.我写了一个修改语句(测试过了,语句没问题),然后调用Db.batch,返回的影响条数全是0...怎么破.

6.19更新反馈 自己已解决

    public void allowAllNomalAskInfo(){
      /*List<AskForLeave> list = new ArrayList<>();*/
      List<Record> list = new ArrayList<>();
      //得到请假信息的Id
      String id = getPara("ids");
      String[] ids = id.split(",");
      for (int i = 0; i <ids.length ; i++) {
//       AskForLeave asc = new AskForLeave();
         Record record = new Record();
         record.set("id",ids[i]);
         list.add(record);
      }
      //得到老师的openid
      String openid = getPara("openid");
      //调用service层方法
      boolean flag = phoneGetAskInfoService.allowAllNormalAsk(openid, list);
      //返回审批是否成功
      if (flag){
         renderSuccess("1");
      }else {
         renderError("0");
      }
   }
public boolean allowAllNormalAsk(String allowopenid, List<Record> IdList){

   boolean succeed = Db.tx(new IAtom() {
      public boolean run() throws SQLException {
         String sql = "update sc_askforleave set status='已审批' ,allowopenid='"+allowopenid+"' where id = ?";
         int[] result = Db.batch(sql,"id",IdList,100);
         for (int i = 0; i < result.length; i++) {
            if(result[i] <= 0){
               System.out.println("没更新到");
               return false;
            }
         }
         return true;
      }
   });
   return succeed;
}


评论区

洛小风

2019-06-17 16:56

杜福忠

2019-06-17 17:36

batch用法貌似没有问题,SQL存在拼接问题。返回0就是要么数据没有什么改变,要么就是where没有匹配上。
其次再说你这个业务,完全可以用SQL where id in(1,2,3) 这样组装,再update执行一次就OK了,何必大炮打蚊子了, 如果业务是 有一个 是已审批就不执行, 那么后面追加一个and条件就可以了啊

洛小风

2019-06-17 17:37

@杜福忠 哈哈,不是,我123,是测试数据,后面可能会有很多数据,我先检查一下拼接问题吧.

洛小风

2019-06-17 17:39

@杜福忠 没发现sql存在拼接问题.我测试过sql了.233

杜福忠

2019-06-17 17:41

@洛小风 我觉得更多情况是 数据库里面数据和你准备修改的是一样的, 所以数据没有变化,返回了0

杜福忠

2019-06-17 17:41

我说拼接是 : allowopenid='"+allowopenid+"' 这段代码。。。

洛小风

2019-06-17 17:43

@杜福忠 你说的这两种情况,我都看了,没问题,不知道能否得到您远程的帮助,方便私信吗?

洛小风

2019-06-19 14:03

@杜福忠 @Jfinal 这个问题我已经解决了,我把controller里面的对象,换成了record ,用record存id的值,List放入record,batch就正常了,但是不知道为什么我的请假类放入list就不行.....难道不能从list中的请假类获取到id吗???

洛小风

2019-06-19 14:05

修改完的代码已经贴上,几乎没有变化.只是List里存放的对象变了

杜福忠

2019-06-19 14:11

感觉AskForLeave对象里面get和set方法不是生成器生成的, 是自建的属性吧?

洛小风

2019-06-19 14:15

@杜福忠 就是自己建的,难道编译出来的class还能不一样吗 .233

杜福忠

2019-06-19 14:19

@洛小风 生成器生成的是 比如:
setId(int id){
set("id", id);
}
而自建的:
setId(int id){
this.id=id
}
这个ID值就没有放入Model里面那个Map里啊, 所以Db.batch里面就取不到值了

洛小风

2019-06-19 14:27

@杜福忠 看到了.原来如此.我说我之前debug的时候,有一步是将值放入map,我还在想,我的id怎么会是个键值对呢.谢谢你哈,.懂了