mybatis可以帮我们自动映射字段,在mapper.xml文件中,我们可以不用去写jdbcType来明确指定数据类型,它会自动解析成相对应的java数据类型,每次在使用了mybatis-generator之后,出于强迫症,我还主动将默认生成的jdbcType给去掉了,一直没出过问题,今天却碰到了一个问题:

出问题的业务场景中,需要根据不同的角色查询不同的订单数据,所以我就直接将角色ID当做参数传递进来,由于有多个角色的情况,所以直接将角色ID拼接成字符串,并用逗号分隔开。

mapper接口:

List getOwnAssignedOrderNo(@Param("backendId") String backendId, @Param("role") String role);

mapper文件:

AND w.backend_id = #{backendId}

AND w.workflow_type = 'manual_check'

AND w.backend_id = #{backendId}

AND w.workflow_type = 'phone_check'

AND w.backend_id = #{backendId}

AND (w.workflow_type = 'manual_check' OR w.workflow_type = 'phone_check')

大家注意看我这里的写法,算得上是中规中矩,role参数已经明确指定了string类型,而且在if条件中,我并没有什么特殊的写法,结果却悲剧了:

Caused by: org.apache.ibatis.exceptions.PersistenceException:

### Error querying database. Cause: java.lang.NumberFormatException: For input string: "2,3"

### Cause: java.lang.NumberFormatException: For input string: "2,3"

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)

... 140 common frames omitted

Caused by: java.lang.NumberFormatException: For input string: "2,3"

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)

at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)

at java.lang.Double.parseDouble(Double.java:538)

at org.apache.ibatis.ognl.OgnlOps.doubleValue(OgnlOps.java:242)

at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:99)

at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:142)

at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:794)

at org.apache.ibatis.ognl.ASTEq.getValueBody(ASTEq.java:52)

at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)

at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)

at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)

at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458)

at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)

at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)

at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)

at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)

at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)

at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)

at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)

at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)

at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)

at com.github.pagehelper.SqlUtil._processPage(SqlUtil.java:247)

at com.github.pagehelper.SqlUtil.processPage(SqlUtil.java:229)

at com.github.pagehelper.PageHelper.intercept(PageHelper.java:118)

at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)

at com.sun.proxy.$Proxy349.query(Unknown Source)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)

... 146 common frames omitted

错误非常的熟悉,类型转换异常,而且定位到了我的role参数上,一开始让我很费解,难道不能用数字类型的字符串做过参数?

以为需要对mybatis做什么特殊的配置,但是后来去其他项目比对了一下,并没有什么不一样,又跑去百度了一波,看到有人提到说没有指定jdbcType导致的,但是我这个不是字段,而是在if条件中,没办法指定jdbcType。

继续查资料,看到有大佬给了一种写法,需要对if条件中的参数做toString(),写法如下:

AND w.backend_id = #{backendId}

AND w.workflow_type = 'manual_check'

AND w.backend_id = #{backendId}

AND w.workflow_type = 'phone_check'

AND w.backend_id = #{backendId}

AND (w.workflow_type = 'manual_check' OR w.workflow_type = 'phone_check')

不是我说,这种写法真的是很烦,判断条件简单还好说,如果复杂的条件,岂不是要写到吐血,遂继续百度之,终于找到了一种简单的写法:单引号和双引号调换一下

AND w.backend_id = #{backendId}

AND w.workflow_type = 'manual_check'

AND w.backend_id = #{backendId}

AND w.workflow_type = 'phone_check'

AND w.backend_id = #{backendId}

AND (w.workflow_type = 'manual_check' OR w.workflow_type = 'phone_check')

这样就舒服多了,不用每个if条件中都写toString(),而且问题也解决了!

此问题的出现,可以说完全是平时不注意细节所致,在项目中,我之前是有看到过同事这样写过,当时还纳闷儿为什么要将单双引换着用,强迫症的我甚至还差点儿手贱改了人家的代码,想要帮人家改邪归正,现在回想起来还真的是肤浅、无知~

方法总结:

1、如果在传参字段中,可以考虑追加jdbcType属性来指定数据类型;

2、如果在if条件中,用字符串比对的的地方少,可以直接在字符串后面跟一个toString()方法;

3、如果在if条件中,用字符串比对的地方多,直接将单引和双引调换位置;

综合考虑,尽量使用第三种写法,简单实用!

0字符串 if mapper test_mybatis的if判断条件将字符串解析成了数字相关推荐

  1. 王道综合题17.设计一个算法用于判断带头结点的循环双链表是否对称及其注意思考:while循环第二个判断条件易误写成p->next!=q,分析这样会产生什么问题。

    算法思想: 让p从左向右扫描,q从右向左扫描,直到它们指向同一结点(p==q,当循环双链表中结点个数为奇数时)或相邻(p->next=q或q->prior=p,当循环双链表中结点个数为偶数 ...

  2. java字符串含有特殊字符_[Java教程]判断输入的字符串是否含有特殊字符和表情_星空网...

    判断输入的字符串是否含有特殊字符和表情 2017-07-27 0 reg = /[~#^$@%&!?%*]/gi; if (reg.test(postdata.Name.trim())) { ...

  3. java 判断字符串是否包含字母_Java中判断某一字符串是否包含数字、字母和中文...

    importjava.util.regex.Matcher;importjava.util.regex.Pattern;public classStrValidate {//纯数字 private s ...

  4. c语言对比两个字符串相等,c语言中如何判断两个字符串相等

    可以使用库函数strcmp判断,具体如下: strcmp是C语言比较字符串的库函数,形式为int strcmp(char *a, char *b); 该函数会对a和b的每个字符,按照ascii码值比较 ...

  5. python中如何判断两个字符串是否相等_python怎样判断两个字符串是否相同

    原标题:python怎样判断两个字符串是否相同 python中,判断两个字符串是否相等或一样,可以使用==或者is来判断:判断不一样可以使用 is not. 示例 使用注意事项 1.有时候两个字符串打 ...

  6. Shell条件测试之字符串比较

    1.字符串比较(字符串运算符): str1 = str2 : 相等比较 str1 != str2 : 不等比较 str1 < str2 : str1小于str2为true,比较字母在字母表顺序, ...

  7. mysql的条件求和函数_使用SQL语句统计数据时sum和count函数中使用if判断条件的讲解...

    首先举个栗子(不想看的话直接下面看总结): order_type:订单类型 open_id:用户唯一标识 SELECT date(create_time) AS '当天日期', sum(real_pr ...

  8. C语言判断回文字符串

    C语言判断回文字符串 #include<stdio.h> char *huiwen(char *str){int i, j,t=0;for(i = 0,j = strlen(str) - ...

  9. java取字符串中不相同的字母_java 判断两个字符串是否为相同字母异序词 --- 记录...

    前两天接触了这么一道有趣的题目: String org1="arm"; String org2="ram"; return true; String org3= ...

最新文章

  1. centos7 查看ip_VMware安装CentOS 7操作系统详细操作教程(网络配置)
  2. Create Maintenance Plans
  3. Ubuntu下firefox启动问题
  4. boost 变量类型转换
  5. 160 - 32 genocide1
  6. Java String和Date的转换 Date类型操作
  7. 树莓派3B+ (PPOE+hostapd)变身无线路由器
  8. asp功放怎么装_客厅家庭影院该怎么摆放?
  9. 每日算法系列【LeetCode 1006】笨阶乘
  10. [HDU 1003] Max Sum
  11. Bugzilla 下载和安装
  12. Nodejs Blob流方式下载
  13. 行人跟踪之身份识别(一)
  14. java最好用的浏览器_国内好的pc浏览器评测
  15. Redis主从复制-Replication
  16. electron打开系统默认浏览器
  17. Python 海龟绘图:turtle库的使用
  18. 基于javaweb的旅游管理系统(java+jsp+html5+bootstrap+servlet+mysql)
  19. 给键盘加上音效(机械键盘音效)
  20. 提高代码质量之静态代码检查

热门文章

  1. Java基础-Date类常用方法介绍
  2. win7、win10进程pid4占用80端口的解决办法
  3. 服务器端linux发行版的选择
  4. 12.OpenStack镜像和存储服务配置
  5. Unity3D热更新LuaFramework入门实战
  6. Vertica的这些事lt;十二gt;—— vertica存储统计信息
  7. WebStorm配置SVN
  8. 多线程中的使用共享变量的问题
  9. sicily 1004 I Conduit!
  10. .net mysql中文乱码解决办法