自定义注解+泛型+反射实现SQL拼接

简介:
生产需求,代码框架没有用到mybatis,采用SQL直接执行方式。因为需要对不同的表进行插入数据操作,这里通过自定义注解+泛型+反射工具类,实现智能化SQL拼接,代码封装思路挺好的,值得记录学习。

1.方法调用入口示例

    AtomicInteger failNum = new AtomicInteger();  if (dataList.size()>0){
        Lists.partition(dataList,100).parallelStream().forEach(l->{ try {
                SqlDataUtil<FinancingRequirement> util = new SqlDataUtil<>(FinancingRequirement.class);  String insertSql = util.getInsertSql(l, "XYD_UPLOAD_FINANCING_REQ");  Db.use(dataSource).execute(insertSql);  log.info("当前执行SQL-{}",insertSql);  }catch (Exception e){ failNum.set(failNum.get() + l.size());  log.error("当前报错数据如下-{}",l);  e.printStackTrace();  }
        });  } return "总数据" + dataList.size() + "条,入库成功" + (dataList.size()-failNum.get()) + "条!"; }

2.核心封装工具类

package com.ahzx.xed.util;

import cn.hutool.core.util.ReflectUtil;
import com.ahzx.system.annotations.SqlDeal;
import com.alibaba.fastjson.JSONObject;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

/**
 * SqlDataUtil
 *
 * @author jiangnan
 * @date 2022/6/1
 */
public class SqlDataUtil<T> {
    /**
     * 实体对象
     */
    public Class<T> clazz;

    /**
     * 表名称
     */
    private String tableName;

    /**
     * 数据列表
     */
    private List<T> list;

    public SqlDataUtil(Class<T> clazz) {
        this.clazz = clazz;
    }
    private void init(List<T> list, String tableName) {
        if (list == null) {
            list = new ArrayList<T>();
        }
        this.list = list;
        this.tableName = tableName;
    }

    private String insertDeal() {
        StringBuilder insertBuffer = new StringBuilder("insert into ");
        StringBuilder keyBuffer = new StringBuilder("(");
        StringBuilder valueBuffer = new StringBuilder();
        Field[] fields = ReflectUtil.getFields(clazz);
        for (Field field : fields) {
            SqlDeal sqlDeal = field.getAnnotation(SqlDeal.class);
            if (sqlDeal!=null){
                keyBuffer.append("`").append(sqlDeal.column()).append("`").append(",");
            }
//            valueBuffer.append(field.getName()).append(",");
        }
        keyBuffer.replace(keyBuffer.length()-1, keyBuffer.length(), ")");
        for (T vo : list) {
            valueBuffer.append("(");
            for (Field field : fields) {
                if (field.getAnnotation(SqlDeal.class)!=null){
                    Object fieldValue = ReflectUtil.getFieldValue(vo, field);
                    valueBuffer.append(objectDeal(fieldValue)).append(",");
                }
            }
            valueBuffer.replace(valueBuffer.length()-1, valueBuffer.length(), "),");
        }
        valueBuffer.replace(valueBuffer.length()-1,valueBuffer.length(),"");
        insertBuffer.append(" ").append(tableName);
        insertBuffer.append(" ").append(keyBuffer);
        insertBuffer.append(" ").append("values");
        insertBuffer.append(" ").append(valueBuffer);
        return insertBuffer.toString();
    }
    public String getInsertSql(List<T> list, String tableName) {
        this.init(list, tableName);
        return insertDeal();
    }

    /**
     * 数据格式转换+脏数据过滤
     */
    private String objectDeal(Object fieldValue){
        if (fieldValue==null){
            return "null";
        } else {
            return "'"+fieldValue.toString().replaceAll("'","")+"'";
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值