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


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


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

package com.seven.common;

import com.jfinal.plugin.activerecord.Config;
import com.jfinal.plugin.activerecord.DbKit;
import com.jfinal.plugin.activerecord.DbPro;
import com.jfinal.plugin.activerecord.Record;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author xuyanfeng
 * @Description: TODO
 * @date 2019/5/23
 */
public class RenzhiDbPro extends DbPro {



    @Override
    public int[] batchSave(String tableName, List<Record> recordList, int batchSize) {
        if (recordList != null && recordList.size() != 0) {
            Record record = recordList.get(0);
            Map<String, Object> cols = record.getColumns();
            int index = 0;
            String pks = "";
            StringBuilder columns = new StringBuilder();
            Set<Map.Entry<String, Object>> entries = cols.entrySet();
            for (Map.Entry<String, Object> e : entries) {
                if (config.getDialect().isOracle()){
                    Object value = e.getValue();
                    if (value instanceof String && ((String)value).endsWith(".nextval")) {
                        //主键
                        pks = pks.concat(e.getKey()).concat(",");
                        continue ;
                    }
                }

                if (index++ > 0) {
                    columns.append(',');
                }

                columns.append(e.getKey());
            }

            if (pks.length() > 0){
                pks = pks.replaceFirst(",", "");
            }

            StringBuilder sql = new StringBuilder();
            List<Object> parasNoUse = new ArrayList();
            config.getDialect().forDbSave(tableName, pks.split(","), record, sql, parasNoUse);
            return this.batch(sql.toString(), columns.toString(), recordList, batchSize);


        } else {
            return new int[0];
        }
    }
}



#### 创建MyDbProFactory实现IDbProFactory

package com.seven.common;

import com.jfinal.plugin.activerecord.DbPro;
import com.jfinal.plugin.activerecord.IDbProFactory;

/**
 * @author xuyanfeng
 * @date 2019/5/23
 */
public class RenzhiDbProFactory implements IDbProFactory {




    @Override
    public DbPro getDbPro(String configName) {
        return new RenzhiDbPro();
    }
}



#### Arp设置

  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 请问应该怎么搞哈?

热门分享

扫码入社