当前位置: 首页 > news >正文

解决生成的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语句的时候,两个单引号会被像转移字符一样处理成一个单引号入库,这样即不会报错,也可以保留文本的原始内容

http://www.lryc.cn/news/269415.html

相关文章:

  • 【Linux 程序】1. 程序构建
  • GLTF 编辑器实现逼真3D动物毛发效果
  • 【Go语言入门:Go语言的方法,函数,接口】
  • vue-cli3/webpack打包时去掉console.log调试信息
  • 企业品牌推广在国外媒体投放的意义和作用何在?
  • ArcGIS批量计算shp面积并导出shp数据总面积(建模法)
  • 代码质量评价及设计原则
  • 编程笔记 html5cssjs 012 HTML分块
  • 【持续更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】
  • nginx+rsyslog+kafka+clickhouse+grafana 实现nginx 网关监控
  • User maven 通过什么命令能查到那个包依赖了slf4j-simple-1.7.36.jar
  • 什么牌子冻干猫粮性价比高?性价比高的五款冻干猫粮牌子推荐
  • 扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • Zabbix“专家坐诊”第221期问答汇总
  • Netty—Reactor线程模型详解
  • 开源verilog模拟 iverilog verilator +gtkwave仿真及一点区别
  • mysql中按字段1去重,按字段2降序排序
  • OCP NVME SSD规范解读-4.NVMe IO命令-2
  • 平凯数据库亮相 2023 信息技术应用创新论坛
  • 2024深入评测CleanMyMac X4.14.6破解版新的功能
  • WPF+Halcon 培训项目实战(8):WPF+Halcon初次开发
  • Vue - 实现文件导出文件保存下载
  • c基础学习(一)
  • c语言的文件操作
  • C语言 volatile关键字
  • IDEA快捷使用-快捷键模板
  • 在VMware安装CentOS 7:详细教程
  • [Angular] 笔记 10:服务与依赖注入
  • 【产品经理】axure中继器的使用——表格增删改查分页实现