hibanate实现数据库批量插入或批量更新的工具方法

MySql

一、批量插入

	/**
     * 
    * @author 陈笑璞
    * @Title: batchSaveMySQL
    * @Description: mysql批量插入的工具类
    * @param entityManager entityManager service的getEm()
    * @param table 表名
    * @param list 数据列表
    * @param fields 字段列表
    * @throws CustomException 参数及其意义
    * @return int 返回成功保存的条数(状态)
     */
    public static int batchSaveMySQL(EntityManager entityManager,String table,List<Map<String, Object>> list,List<String> fields) throws CustomException {
   
        int resultNum=0;
        if (list.size() == 0) {
   
        	return resultNum;
		}
        int len=100;// len的倍数就保存一次方式
        StringBuilder sql = new StringBuilder("INSERT INTO ")
        		.append(table).append(" (");
        for(int i=0;i<fields.size();i++) {
   
        	sql.append("`").append(fields.get(i)).append("`");
        	if(i == fields.size()-1) {
   
                sql.append(")"); 
            }else {
   
                sql.append(", ");
            }
		}
        sql.append(" VALUES ");
        StringBuilder sql1 = new StringBuilder(sql);// 余数后的处理sql
        int myNum = fields.size();
        for (int i=0;i<len;i++) {
   
        	if (i > 0) sql.append(", ");
        	sql.append("(");
        	for(int j=0;j<myNum;j++) {
   
        		sql.append("?");
        		if(j == myNum-1) {
   
                    sql.append(")"); 
                }else {
   
                    sql.append(", ");
                }
        	}
		}
        
        List<Object> data=new ArrayList<>();
        for(int i=0;i<list.size();i++) {
   
            Map<String, Object> entity = list.get(i);
            for (String string : fields) {
   
                data.add(entity.get(string));
            }

            if((i+1)%len==0) {
   
                Query query2=entityManager.createNativeQuery(sql.toString());
                setQueryParams(query2, data);
                resultNum += query2.executeUpdate();
                data=new ArrayList<>();// 重新创建对象
            } else if (i==list.size()-1) {
   // 处理好取余后的余数数据逻辑
            	for (int ii=0,length=((i+1) % len);ii<length;ii++) {
   
                	if (ii > 0) sql1.append(", ");
                	sql1.append("(");
                	for(int j=0;j<myNum;j++) {
   
                		sql1.append("?");
                		if(j == myNum-1) {
   
                            sql1.append(")"); 
                        }else {
   
                            sql1.append(", ");
                        }
                	}
        		}
            	Query query2=entityManager.createNativeQuery(sql1.toString());
                setQueryParams(query2, data);
                resultNum += query2.executeUpdate();
            }
        }
        System.out.println("resultNum===>>>" + resultNum);
        return resultNum;
    }

调用方法如下:

	public static void main</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值