解决 JFInal Db.batchSave 方法 在oracle下 序列无效


oracle下使用Db.batchSave()会提示无效的序列,解决方法直接上代码


#### 集成DbPro,覆盖batchSave方法

  1. package com.seven.common;
  2.  
  3. import com.jfinal.plugin.activerecord.Config;
  4. import com.jfinal.plugin.activerecord.DbKit;
  5. import com.jfinal.plugin.activerecord.DbPro;
  6. import com.jfinal.plugin.activerecord.Record;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Set;
  12.  
  13. /**
  14.  * @author xuyanfeng
  15.  * @Description: TODO
  16.  * @date 2019/5/23
  17.  */
  18. public class RenzhiDbPro extends DbPro {
  19.  
  20.  
  21.  
  22.     @Override
  23.     public int[] batchSave(String tableName, List<Record> recordList, int batchSize) {
  24.         if (recordList != null && recordList.size() != 0) {
  25.             Record record = recordList.get(0);
  26.             Map<String, Object> cols = record.getColumns();
  27.             int index = 0;
  28.             String pks = "";
  29.             StringBuilder columns = new StringBuilder();
  30.             Set<Map.Entry<String, Object>> entries = cols.entrySet();
  31.             for (Map.Entry<String, Object> e : entries) {
  32.                 if (config.getDialect().isOracle()){
  33.                     Object value = e.getValue();
  34.                     if (value instanceof String && ((String)value).endsWith(".nextval")) {
  35.                         //主键
  36.                         pks = pks.concat(e.getKey()).concat(",");
  37.                         continue ;
  38.                     }
  39.                 }
  40.  
  41.                 if (index++ > 0) {
  42.                     columns.append(',');
  43.                 }
  44.  
  45.                 columns.append(e.getKey());
  46.             }
  47.  
  48.             if (pks.length() > 0){
  49.                 pks = pks.replaceFirst(",", "");
  50.             }
  51.  
  52.             StringBuilder sql = new StringBuilder();
  53.             List<Object> parasNoUse = new ArrayList();
  54.             config.getDialect().forDbSave(tableName, pks.split(","), record, sql, parasNoUse);
  55.             return this.batch(sql.toString(), columns.toString(), recordList, batchSize);
  56.  
  57.  
  58.         } else {
  59.             return new int[0];
  60.         }
  61.     }
  62. }



  1. #### 创建MyDbProFactory实现IDbProFactory
  2.  
  3. package com.seven.common;
  4.  
  5. import com.jfinal.plugin.activerecord.DbPro;
  6. import com.jfinal.plugin.activerecord.IDbProFactory;
  7.  
  8. /**
  9.  * @author xuyanfeng
  10.  * @date 2019/5/23
  11.  */
  12. public class RenzhiDbProFactory implements IDbProFactory {
  13.  
  14.  
  15.  
  16.  
  17.     @Override
  18.     public DbPro getDbPro(String configName) {
  19.         return new RenzhiDbPro();
  20.     }
  21. }



#### Arp设置

  1.   arp.setDbProFactory(new RenzhiDbProFactory())



评论区

JFinal

2019-05-24 16:29

非常有用的分享,我也收藏一份,感谢分享

山东小木

2020-07-15 16:50

@JFinal 这个在jfinal自身实现了吗?

JFinal

2020-07-15 17:27

@山东小木 这个需求很弱,没有实现

少部分需求扩展一下挺好

fmpoffice

2022-12-18 17:55

pgsql 请问应该怎么搞哈?

热门分享

扫码入社