根据console打印出来的预编译sql和插入值,获得insert sql语句

import java.util.ArrayList;
import java.util.List;

/**
 * @author lxc on 2019-6-4 15:57.
 */
public class Test {

    public static List<String> sqlTypeList;
    public static void main(String[] args) {
        //预编译sql
        String sql = "insert into INFO ( ID_INFO, SOURCE, SYSTEME, TEM_ID, TAT_NO, CHANNECE_CODE, DEP_CODE, SYST_FROM, STATE, CREATED_BY, RENE_TYPE, INNCYPE, INSE_END_TIME, RENEWRATE, OPERAYPE, INSNCE_BEGIN_E, TYPE_RCE, UPDATED_BY, CLAIMES, CENTILE, CHANN_DETAIL_CODE, APPLY_PO_NO_S, POLICY_NS, APPPOLI_J, POL_J, APPLY_PO_NO_F, POLIC_F, OFFEMOUNT_S, OFFOUNT_J, FLWID, ISOINE )values( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ";

        //插入的值
        String values = "8A7B61F16CB32CAFE053060B1F0A49F5(String), 7(String), M3IT(String), 1120107007(String), 粤A*(String), 7(String), " +
                "2041033(String), PTS(String), 0(String), system(String), zb(String), 3(String), 2020-06-04 23:59:59.0(Timestamp), " +
                "0(Integer), 1(String), 2019-06-05 00:00:00.0(Timestamp), 3(String), system(String), 0(Integer), 63(Integer), L(String), " +
                "50410333900218711135(String), 10410333900155881437(String), 50410333900218711136(String), 10410333900155881438(String)," +
                " 50410333900218711133(String), 10410333900155881438(String), 1432.19(BigDecimal), 147.5(BigDecimal), " +
                "0.0(BigDecimal), N0MiXA3X5NqmIeeN(String), 1(String)";

            getSql(sql,values);
    }

    /**
     * description:获得insert sql语句
     * @date: 2019-6-6 15:49
     * @author: lxc
     * @param sql
     * @param values
     * @return
     */
    public static String getSql(String sql ,String values){
        //字段值
        String value = "";
        //截取后的字段值
        String blanceValues = "";
        //临时字段值
        String temp = "";
        List<TypeValue> valueList = new ArrayList<>();
        Test test = new Test();
        do {
            int index = 0;
            for(int i = 0; i < Test.SqlTypeList().size(); i++){
                String sqlType = Test.SqlTypeList().get(i);
                //匹配整个串的第一个值
                int tempIndex = values.indexOf("), ");
                if (tempIndex > 0) {
                    //截取匹配到的第一个值
                    temp = (values.substring(0, tempIndex + 2));
                }else {
                    temp = values;
                }
                //根据
                index = temp.indexOf(matchString(sqlType));
                if (index > 0) {
                    System.err.println("index:"+index);
                    value = values.substring(0, index);
                    System.err.println("value:"+value);
                    try {
                        blanceValues = values.substring(index + sqlType.length() + 3, values.length());
                    }catch (Exception e){
                        //最后没有逗号
                        blanceValues = values.substring(index + sqlType.length() + 2, values.length());
                    }
                    System.err.println("blanceValues:"+blanceValues);
                    //去掉前后空格
                    values = blanceValues.trim();
                    TypeValue typeValue = test.new TypeValue();
                    typeValue.setSqlType(sqlType);
                    typeValue.setValue(value);
                    valueList.add(typeValue);
                    break;
                }
            }
            if (index < 0){
                //如果index小于0,则匹配不上,直接value = null
                value = null;
            }
        }while (value != null && !"".equals(value));
        System.err.println(valueList.size());

        int firstLeftBracketIndex = sql.indexOf("(");
        String tempSql = sql.substring(firstLeftBracketIndex,sql.length());
        int firstRightBracketIndex = sql.indexOf(")");
        tempSql = sql.substring(firstLeftBracketIndex,firstRightBracketIndex);
        System.err.println(tempSql);

        String[] tempSqls = tempSql.split(",");
        System.err.println(tempSqls.length);

        if (tempSqls.length != valueList.size()){
            System.err.println("入参与占位符个数不一致,入参长度:"+valueList.size()+",占位符个数:"+tempSqls.length);
        }

        for (TypeValue typeValue:valueList){
            if (SqlType.STRING.getType().equalsIgnoreCase(typeValue.getSqlType())){
                sql = sql.replaceFirst("\\?","'"+typeValue.getValue()+"'");
            }else if (SqlType.TIMESTAMP.getType().equalsIgnoreCase(typeValue.getSqlType())){
                String dateTime = typeValue.getValue().replace(".0","");
                sql = sql.replaceFirst("\\?","to_date ('"+dateTime+"' , 'YYYY-MM-DD HH24:MI:SS' )");
            }else if (SqlType.INTEGER.getType().equalsIgnoreCase(typeValue.getSqlType()) ||
                    SqlType.BIG_DECIMAL.getType().equalsIgnoreCase(typeValue.getSqlType())){
                sql = sql.replaceFirst("\\?",typeValue.getValue());
            }
        }

        System.err.println(sql);
        return sql;
    }

    /**
     * sql类型 枚举
     */
    public enum SqlType{

        STRING("String"),
        TIMESTAMP("Timestamp"),
        INTEGER("Integer"),
        BIG_DECIMAL("BigDecimal"),
        ;
        private String type;

        public String getType() {
            return type;
        }

        SqlType(String type) {
            this.type = type;
        }
    }

    /**
     * 传入sql类型返回(String)格式的字符串
     * @param type
     * @return
     */
    private static String matchString(String type){
        String str = "("+type+")";
        return str;
    }

    /**
     * 把sql类型封装成枚举,以便做循环比较
     * @return
     */
    private static List<String> SqlTypeList(){
        if (sqlTypeList == null) {
            sqlTypeList = new ArrayList<>();
            for (SqlType o : SqlType.values()) {
                sqlTypeList.add(o.type);
            }
        }
        return sqlTypeList;
    }

    /**
     * 值和 sql类型
     */
    public class TypeValue{
        /**
         *  sql类型
         **/
        private String sqlType;
        /**
         * 值
         */
        private String value;

        public String getSqlType() {
            return sqlType;
        }

        public void setSqlType(String sqlType) {
            this.sqlType = sqlType;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值