解决生成的insert语句内有单引号的情况

背景

因为Mybatis-Plus的saveBatch()方法的批量插入其实也是循环插入,而不是真正的一个SqlSession完成的批插,效率很低。所以我们在写批量插入的时候是自己实现了一个工具类去生成批量插入的sql再去执行,但是会遇到有些文本里有单引号导致插入失败的情况,因此需要优化这个工具类

优化工具类

先贴一下优化后的工具类的代码

/**
     * 构建批量插入语句 insert 语句
     *
     * @param clazz        实体类class
     * @param beanList     要插入的带值的对象集合
     * @param ignoreFields 需要忽略的属性名集合
     */
    public static <T> String getInsertString(Class<T> clazz, Collection<T> beanList, String... ignoreFields) {
   
        StringBuilder insertSql = new StringBuilder();
        String className = clazz.getSimpleName();
        insertSql.append("insert into ").append(StrUtil.toUnderlineCase(className)).append("(");

        Field[] allFields = FieldUtils.getAllFields(clazz);

        // 构建字段
        StringBuilder columnSql = new StringBuilder();
        for (Field field : allFields) {
   
            // 构建非static的属性
            String name = field.getName();

            if (!isIgnore(ignoreFields, name)) {
   
                if (!Modifier.isStatic(field.getModifiers())) {
   
                    columnSql.append(StrUtil.toUnderlineCase(name)).append(",");
                }
            }
        }

        insertSql.append(StrUtil.removeSuffix(columnSql.toString(), ",")).append(")").append(" values ");

        // 循环构建参数
        for (T t : beanList) {
   
            StringBuilder paramsSql = new StringBuilder();
            paramsSql.append("(");

            // 根据字段构建参数
            for (Field field : allFields) {
   
                // 构建非static的属性
                String name = field.getName();

                if (!isIgnore(ignoreFields, name)) {
   
                    if (!Modifier.isStatic(field.getModifiers())) {
   
                        Object fieldValue = ReflectUtil.getFieldValue(t, field.getName());

                        /* 根据格式转换数据 */
                        if (fieldValue instanceof String) {
   
                            String fieldValueStr = (String) ReflectUtil.getFieldValue(t, name);
                            //防止值里面有'导致插入数据失败
                            if (StringUtils.isNotBlank(fieldValueStr)) {
   
                                fieldValueStr = fieldValueStr.replaceAll("'", "''");
                                paramsSql.append("'").append(fieldValueStr).append("',");
                            } else {
   
                                paramsSql.append("null,");
                            }
                        } else if (fieldValue instanceof Enum) {
   
                            paramsSql.append("'").append(ReflectUtil.getFieldValue(t, name)).append("',");
                        } else if (fieldValue instanceof Date) {
   
                            Date dateValue = (Date) ReflectUtil.getFieldValue(t, name);
                            paramsSql.append("'").append(DateUtil.format(dateValue, DatePattern.NORM_DATETIME_PATTERN)).append("',");
                        } else if (fieldValue instanceof LocalDateTime) {
   
                            LocalDateTime dateValue = (LocalDateTime) ReflectUtil.getFieldValue(t, name);
                            paramsSql.append("'").append(DateUtil.format(dateValue, DatePattern.NORM_DATETIME_PATTERN)).append("',");
                        } else {
   
                            paramsSql.append(ReflectUtil.getFieldValue(t, name)).append(",");
                        }
                    }
                }
            }

            insertSql.append(StrUtil.removeSuffix(paramsSql.toString(), ",")).append(")").append(",");
        }

        return StrUtil.removeSuffix(insertSql.toString(), ",");
    }

处理方案

对于’这种特殊符号,可以直接将一个单引号修改为两个单引号,在执行sql语句的时候,两个单引号会被像转移字符一样处理成一个单引号入库,这样即不会报错,也可以保留文本的原始内容

相关推荐

  1. 解决生成insert语句单引号情况

    2023-12-30 18:56:02       58 阅读
  2. insert语句

    2023-12-30 18:56:02       27 阅读
  3. 一键生成insert,update,delete,mybatis sql 语句

    2023-12-30 18:56:02       30 阅读
  4. python3 csv解析单引号包含特殊字符字段

    2023-12-30 18:56:02       59 阅读
  5. MySQL 数据库中 Insert 语句锁机制

    2023-12-30 18:56:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-30 18:56:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-30 18:56:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-30 18:56:02       87 阅读
  4. Python语言-面向对象

    2023-12-30 18:56:02       96 阅读

热门阅读

  1. ceph之rados设计原理与实现:crush算法

    2023-12-30 18:56:02       61 阅读
  2. Kubernetes 网络架构

    2023-12-30 18:56:02       53 阅读
  3. Python中的函数

    2023-12-30 18:56:02       60 阅读
  4. Matlab实时读取串口数据并实时画图方法

    2023-12-30 18:56:02       65 阅读
  5. epoll并发编程

    2023-12-30 18:56:02       55 阅读
  6. Linux面试题 5

    2023-12-30 18:56:02       47 阅读
  7. python cgi获取前端传送json

    2023-12-30 18:56:02       58 阅读
  8. 【Linux 程序】1. 程序构建

    2023-12-30 18:56:02       53 阅读
  9. Android Studio导入现有项目的方法

    2023-12-30 18:56:02       58 阅读
  10. MyBatisPlus之逻辑删除

    2023-12-30 18:56:02       62 阅读