tk-mybatis 通用mapper 使用xml擴展sql小坑

為了減少mybatis手寫xml的代碼量和出錯率,我使用了tk-mybatis通用mapper拯田。具體過程可以參考SpringBoot集成tk.mybatis

然鵝,通用mapper只是實現(xiàn)了常用SQL操作,對于一些復雜操作或者效率要求高的操作實現(xiàn)起來卻很不方便侣监,所以想著可以結(jié)合xml來擴展這些復雜SQL臣淤。

根據(jù)http://www.reibang.com/p/50449dde7f2b配置好了擴展xml橄霉。但是我不想在xml中定義繁瑣的resultMap來定義數(shù)據(jù)庫字段和javabean字段的映射關(guān)系邑蒋,這樣不僅修改起來繁瑣,而且很容易出錯医吊,我想使用JavaBean或者數(shù)據(jù)庫實體類Entity來定義resultMap,再結(jié)合單元測試束莫,完美。

如下是表sql

CREATE TABLE `subscribe` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `user_id` bigint(20) default NULL COMMENT '訂閱者用戶id',
  `type` INT default NULL COMMENT '訂閱類型',
  `subordinate` varchar(64) default NULL COMMENT '所屬',
  `trigger_type` INT DEFAULT NULL COMMENT '觸發(fā)條件類型',
  `trigger_value` INT DEFAULT NULL COMMENT '觸發(fā)值',
  `create_time` DATETIME default CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `publish_time` DATETIME DEFAULT NULL COMMENT '發(fā)布時間',
  `last_publish_time` DATETIME DEFAULT NULL COMMENT '上一次發(fā)布時間',
  `publish_frequency` INT DEFAULT NULL COMMENT '發(fā)布頻率',
  `delete_time` DATETIME default null COMMENT '刪除時間',
  `is_deleted` BOOLEAN default false COMMENT '刪除',

  PRIMARY KEY (`id`),
  INDEX subscribe_user_id(user_id),
  INDEX subscribe_publish_time(publish_time)
) ENGINE=InnoDB;

insert into subscribe (user_id, type, subordinate, trigger_type, trigger_value, publish_time, publish_frequency)
              values (1, 0, 110101, 0, 0, '2019-05-27 07:50:00', 0);
insert into subscribe (user_id, type, subordinate, trigger_type, trigger_value, publish_time, publish_frequency)
values (1, 0, 110101, 0, 1, '2019-05-27 07:50:00', 0);

如下是JavaBean

package com.eee.subscribe.domain;

import lombok.Builder;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

@Data
@Builder
@Table(name = "subscribe")
public class Subscribe implements Serializable {
    @Id
    @KeySql(useGeneratedKeys = true)
    private Long id;

    private Long userId;

    private SubscribeType type;

    private String subordinate;

    private TriggerType triggerType;

    private TriggerValue triggerValue;

    private Date createTime;

    private Date publishTime;

    private Date lastPublishTime;

    private PublishFrequency publishFrequency;

    private Date deleteTime;

    @Column(name = "is_deleted")
    private boolean deleted;
}

如下是mapper

@Mapper
@Component
interface SubscribeMapper extends BaseMapper<Subscribe, Long> {
    Subscribe selectById(Long id);
}

如下是mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.eee.subscribe.dao.SubscribeMapper">

    <select
            id="selectById"
            parameterType="java.lang.Long"
            resultType="com.eee.subscribe.domain.Subscribe">
        SELECT * FROM
            subscribe
        WHERE id = #{id};
    </select>
</mapper>

但是執(zhí)行測試報錯了:

org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'SUBORDINATE' from result set.  Cause: org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "nqghMS" [22018-199]
; Data conversion error converting "nqghMS" [22018-199]; nested exception is org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "nqghMS" [22018-199]

后來我又打開了mapUnderscoreToCamelCase奇昙。但報錯還是依舊蒋譬。我甚至懷疑是mapUnderscoreToCamelCase沒有生效揍诽,然鵝打開SpringBoot監(jiān)控后發(fā)現(xiàn)此選項確實打開了栗竖。

mybatis.configuration.mapUnderscoreToCamelCase=true

最終發(fā)現(xiàn)是因為框架內(nèi)映射代碼選擇字段和字段所屬類時竟然有錯誤暑脆。如下圖框架代碼所示狐肢,取Subscribe表的type字段時,columnName是type份名,但parameterType并不是對應(yīng)的SubscribeType類型,而是String類型僵腺,導致選擇了錯誤的typeHandler,最后解析值錯誤了......


image.png

不知道這是為啥普监,但解決方法被我猜了了,就是實體映射JavaBean類的字段順序要和建表的字段順序相同凯正,而且mapUnderscoreToCamelCase開不開啟也沒影響。

很奇怪的一個bug......

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淆珊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子施符,更是在濱河造成了極大的恐慌,老刑警劉巖戳吝,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贯涎,死亡現(xiàn)場離奇詭異,居然都是意外死亡塘雳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門隘马,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酸员,你說我怎么就攤上這事♂`拢” “怎么了沥潭?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钝鸽。 經(jīng)常有香客問我,道長寞埠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任仁连,我火速辦了婚禮阱穗,結(jié)果婚禮上使鹅,老公的妹妹穿的比我還像新娘。我一直安慰自己患朱,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布冰沙。 她就那樣靜靜地躺著,像睡著了一般拓挥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侥啤,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天茬故,我揣著相機與錄音盖灸,去河邊找鬼磺芭。 笑死,一個胖子當著我的面吹牛徘跪,可吹牛的內(nèi)容都是我干的琅攘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼坞琴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剧辐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溉奕,失蹤者是張志新(化名)和其女友劉穎忍啤,沒想到半個月后加勤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡叠国,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年戴尸,在試婚紗的時候發(fā)現(xiàn)自己被綠了粟焊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孙蒙。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沾乘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翅阵,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布掷匠,位于F島的核電站岖圈,受9級特大地震影響讹语,放射性物質(zhì)發(fā)生泄漏蜂科。R本人自食惡果不足惜顽决,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一才菠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赋访,春花似錦、人聲如沸蚓耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘫镇。三九已至鼎兽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間接奈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工序宦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人互捌。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像钳降,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遂填,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容