1.in导致的异常

 Data truncation: Truncated incorrect DOUBLE value:

异常过程:

mapper接口如下:

public int updateBatchId(@Param("batchId")String batchId,@Param("idStr")String idStr);

xml中sql如下:

    <update id="updateBatchId" parameterType="java.lang.String">
update pdm_description_error_msg set batch_id = #{batchId},status = "1",process_num = process_num +1
where id in (#{idStr})
</update>

原因分析:

mybatis中in不能这样写,需要使用foreach,不然就会报如上的错误。

解决办法:(这里的idStr是以逗号分隔的,形式是这样的:1,2,3,4)

    <update id="updateBatchId" parameterType="java.lang.String">
update pdm_description_error_msg set batch_id = #{batchId},status = "1",process_num = process_num +1
where id in
<foreach item="item" index="index" collection="idStr.split(',')" open="(" separator="," close=")">
'${item}'
</foreach>
</update>

异常总结

之前写sql时是使用注解的方式写的,通过那种方式,在java代码中是可以直接使用以逗号分隔的字符串的,例子如下:

    public String updateBatchId(String batchId,String idStr){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("update pdm_error_msg set batch_id = '" + batchId + "',status=1,process_num=process_num+1 where " +
" (status=0 or status = 3) and id in ("+idStr+")");
return stringBuilder.toString();
}

这个是在java中直接拼接的sql可以,可以直接使用带逗号的字符串,在xml不行。

2.group_concat

这个mysql中关键字其实一般是不会使用的,但是有时使用group by做分组的时候,又希望把分组的结果拿出来,就可能会使用这个关键字,但是,重点是这个但是,如果返回的字段的长度过长,就会直接截断,然后也不抛异常,然后返回出来的结果就是一个阶段后的结果。

为啥要截断呢?

mysql为了优化性能

那多长会截断呢?

默认就是1024个字节,这才多长啊。

能不能避免不被截断?

可以,不过需要mysql的权限,让dba设置,不过dba爸爸估计不会帮这个忙

总结

严格来说这个锅不是mybatis的锅,其实是mysql为了优化性能搞的,举个例子,如果你程序开发测试环境随便造的数据,都很短,没问题,当部署到生产环境,运行一段时间,出问题,那估计问题就很严重。

3.is not null 和 !=    ;    is null 和 =

这个在平时写sql的时候一般没什么问题,遇见null值判断,都会使用is,或者is not,但是偶尔会写成!=,这就搞飞机了,写成这样sql也不会抛异常,但是就是统计的数据不准确。原因就是null值不能使用 =,!=,<>等判断。

4.provider中sql语句把反斜线去掉,导致的转义问题

  更新于--------------------------------------2020-01-15---------------------------------------

  springboot中使用mybatis,现在很多小伙伴都不使用xml的方式写sql了,而是通过provider,如果牵涉到批量操作,基本上大家都不会直接在mapper中写sql,而是在provider中通过字符串拼接的方式来实现sql,这个写一般的sql没什么问题,一旦遇见一些坑爹的场景其实还是xml的方式比较好,比如下面说的问题:

  场景:把表A中的message字段批量读出来,一次读取100条,批量插入到表B,实现方式是在provider中实现字符串拼接

代码如下:

public String insertCheckMsgBatch(List<CheckMsg> msgList) {
StringBuffer sql = new StringBuffer();
sql.append("insert into table(message,status) values "); if(!CollectionUtils.isEmpty(msgList)) {
int i = 0;
for(CheckMsg msg : msgList) {
i++;
sql.append("("+msg.getMessage()+","+msg.getStatus()); if(i < msgList.size()) {
sql.append("),");
} else {
sql.append(")");
}
}
} return sql.toString();
}

出现的问题: 由于表A中的message带有转义字符,会把字符串中的单引号和双引号转义,但是被上面一搞,所有的转义字符都没了,比如  "\"abc\'"  经过这玩意一搞变成了  ""abc'",但是这个也可以正常插入数据库,但是下次读出来就会出问题,因为这是一个异常的字符串。

解决办法:

  上面问题的根源在于通过provider没有经过PreparedStatement预编译,如果经过这个预编译mybatis其实是可以处理这些特殊的字符的,ok,那就想办法让mybatis预编译,有两种方法,一种是改成xml方式,这种还要改,麻烦,另一个种是直接通过在mapper文件中写批处理sql的方式,这种实际和在xml一样。如下:

  

 @Insert({"<script>" +
"insert into table(message,status) values " +
"<foreach item='item' index='index' collection='msgList' separator=','> " +
"(#{item.message},#{item.status})" +
"</foreach>" +
"</script>"})
public int insertMsgBatch(@Param("msgList") List<Msg> msgList);

这样就可以解决问题了,记录一下

springboot mybatis常见异常及处理方法的更多相关文章

  1. Maven常见异常及解决方法(本篇停更至16-4-12)

    本篇文章记录了老猫在学习整合Maven和SSH过程中遇到的问题,有的问题可以解决.有的问题还不能解决. 方法不一定适合全部的环境.但绝对是本人常遇到的常见异常.在这里做一个笔记和记录,也分享给大家,希 ...

  2. Maven常见异常及解决方法

    异常1: [ERROR] Failed to execute goal on project biz_zhuhai: Could not resolve dependencies for projec ...

  3. maven常见异常以及解决方法

    本文写的是我在整合ssm框架时遇到的一些问题,我估计很多人也会遇到,所以,这里作为一个总结,希望能够帮助大家解决问题 一,加入shiro组件时抛出的异常 加入步骤(略) 问题 1,保存后,无法导入sh ...

  4. python常见异常及解决方法

    异常1: ValueError: unsupported hash type sha224 ERROR:root:code for hash sha256 was not found. Traceba ...

  5. WebServices CXF开发常见异常及解决方法

    2011-7-14 10:10:59 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass ...

  6. Maven常见异常及解决方法---测试代码编译错误

    [ERROR] Please refer to E:\maven\web_nanchang\target\surefire-reports for the individual test result ...

  7. WebDriver(Selenium2) 常见异常及处理方法

    http://uniquepig.iteye.com/blog/1568197 Exception NoSuchElementException Solutions    1. Check the l ...

  8. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

  9. Spring10种常见异常解决方法

    在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 ...

随机推荐

  1. C#工具类SqlServerHelper,基于System.Data.SqlClient封装

    源码: using System; using System.Collections.Generic; using System.Data; using System.Linq; using Syst ...

  2. jmeter返回结果出现乱码

    这是我的问题: 请求的百度地址,返回的数据是中文乱码 去jmeter安装目录的bin下: 修改配置文件jmeter.properties 右键打开 ,查找:sampleresult.default.e ...

  3. Java面向对象——三大特性

    Java面向对象——三大特性 摘要:本文主要介绍了面型对象的三大特性. 封装 什么是封装 封装,就是指一个类隐藏了对象的属性和实现细节,对自己的数据和方法进行访问权限控制,只允许某些类和对象进行访问和 ...

  4. 初识Android App自动化测试框架--Unittest

    1.为什么需要使用框架实现自动化测试 作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免 ...

  5. PHP工作岗位要求

    初级PHP 企业对初级PHP的要求是,在日常工作中,保证编码质量,对一般问题具有解决能力. 1.团队合作:经常是Git或者SVN.主要是为了能够融入敏捷开发团队2.前端:HTML.CSS.JS要精通. ...

  6. windows下编写dll

    dll的优点 简单的说,dll有以下几个优点: 1) 节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中.如果 ...

  7. mac os catalina mongodb最新安装流程

    1.brew安装 不推荐用brew,因为现在mongodb闭源了,brew里已经搜索不到mongodb,不过还是可以用brew安装的,这篇就不写了. 2.官网下载 直接去官网下载一个zip,解压完放到 ...

  8. (转)Unity与3ds Max的单位关系(使用FBX文件)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/a1780531/article/deta ...

  9. Spring Cloud Netflix之Eureka Clients服务提供者

    之前一章我们介绍了如何搭建Eureka Server,这一章,我们介绍如何搭建服务提供者. Eureka Clients介绍 服务的提供者,通过发送REST请求,将自己注册到注册中心(在高可用注册中心 ...

  10. git tag介绍

    我们常常在代码发版时,使用git 创建一个tag ,这样一个不可修改的历史代码版本就像被我们封存起来一样,不论是运维发布拉取,或者以后的代码版本管理,都是十分方便的. git的tag功能git 下打标 ...