Mybatis-那些让人摸不着头脑的报错

本想着,上篇关于Mybatis的文章《MyBatis-从查询昨天的数据说起》只是介绍RabbitMQ以及Spring AMQP中间的一剂调味剂。说说Mybatis是如何完成从sql到对象之间的映射并实现我统计数据的业务逻辑。

但因为上一个流水统计的任务开展比较顺利,所以后面索性又做了个前台展示(后面会再开一篇说说前端以及Bootstrap的一个控件的用法)。显然有展示,必然要有数据,于是又和Mybatis大了两天的交道,对它又有了一些深刻的认识。这里做一个简单的总结,希望不要踩我踩过的坑。

越忙越错的低级bug

上篇已经介绍过Mybatis存在的弊病和过于形式化,这次还要补充一点,那就是有些极其明显的错误需要等到运行的时候才能被发现。

有时候,我们难免会遇到项目很赶的时候,一个功能急等上线,但是仔细看了一眼项目的代码,发现都有现成的代码可以套用,心中暗自窃喜。
于是开始拷贝Dao类,开始拷贝xml文件,再改改其中不一样的sql语句,已经要定义的ResultMap中的映射字段等等,一眼望去,完全没毛病。于是开始打包上测试,然后执行业务操作,发现没有达到预期的效果,再回头看了一眼log,想一掌拍死自己的心都有了。因为你可能仅仅是因为忘记在ResultMap添加需要的一个字段,又或是sql语句中在不该出现的地方出现了一个“,”。要知道,在编译器,Mybatis可是慈眉善目的大善人,等你一旦上车,你会发现他的眼里是容不下一粒沙子,即使是一个“,”也不行。

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
如果你经常和Mybatis打交道,那么对于上面这个报错一定不陌生。你需要仔仔细细的从如下几个方面好好排查
检查xml文件所在的package名称是否和interface对应的package名称一一对应

检查xml文件的namespace是否和xml文件的package名称一一对应

检查函数名称能否对应上

笔者就吃过第二项的亏。上面的三条即使排查问题的方向,也是需要注意的点,因为不满足其中一点,Mybatis都没法让你如愿执行sql语句,然而这一切在执行之前看的都再正常不过了。

ResultMap的一个小常识

上篇我们有提到返回结果定义的ResultMap,同是还提到了定义输入参数的PrameterType。假设现在有这样的一个ResultMap,其中就映射了一个字段identityCardId

image.png

这时候我们在Mybatis的配置文件中写出我们想要查询的sql语句,完全没有问题,可以得到你想要的结果。

image.png

但是如果我们将查询的sql语句“select identity_car_id”改为“select identity_card_id as id”,那么此时ResultMap中的column就要改为id,即使数据库中并不存在id这个字段,因为你在查询的过程中已经将其重命名为id了。

Mysql的小常识

笔者将一个删除符合条件数据的sql语句写到mybatis中,在执行的时候发现报错

MySQL can’t specify target table for update in FROM clause
后来仔细一查才知道,这是Mysql在更新数据报错删除数据时对于from后面是sql子句就会出现问题。
比如执行这样的语句就会报错
“delete from t_official_sys_user
where USER_NAME IN(SELECT USER_NAME FROM t_official_sys_user b group by b.USER_NAME having count(1) > 1)”
需要改为

delete from t_official_sys_user
where USER_NAME IN(select USER_NAME from ( SELECT USER_NAME FROM t_official_sys_user b group by b.USER_NAME having count(1) > 1) as temtable ); ”

也就是说需要将要删除的表先存为一张中间表,然后才能删除。
另外还需要注意一点的是,对于存为中间表的表需要对其命名,就像这里的“as temtable”,否则会报错“Every derived table must have its own alias”。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容